PHP7を試してみた

ChainZ(クリエイター)
いろいろやってます。

せっかくPHP7をインストールしたので、PHP7の面白そうな新機能をためしてみました。

インストールは:http://befool.co.jp/blog/chainzhang/php7-ubuntu14-installation/

??演算子

$a = isset($b) ? $b : 'fallback';

がPHP7では

$a = $b ?? 'fallback'

になります。結構便利な演算子です。JavaScriptのvar a = b || 'fallback';とよく似ていますが、??は若干くせがあります。

タイプヒント

引数のタイプヒント

PHP7ではint, floatなどでも引数のタイプヒントとして使えるようになります。

function buyCoffee(string $name, int $count)
{
$price = 0;
switch ($name)
{
case 'blend':
$price = 450;
break;
case 'latte':
$price = 480;
break;
}
if ($price < 0) return print('No such menu');
$total = $count * $price;
return print("{$name} x {$count} : {$total} yen\n");
}
buyCoffee('latte', 2);
buyCoffee('blend', '9.0');

結果は:

latte x 2 : 960 yen
blend x 9 : 4050 yen

最初は「あれ?」と思ったんですが、buyCoffee('blend', '9.0'); のように、第二引数に文字列を渡しても何のエラーも表示されず実行されました。試しに、

buyCoffee('blend', '適当');

を実行してみたら:

Fatal error: Uncaught TypeError: Argument 2 passed to buyCoffee() must be of the type integer, string given

ちゃんとエラーが出ました。つまり、PHPが渡された引数を、指定した型に変換してみて、ダメだったらエラーを投げるという挙動ですね。これじゃ意味あるのかと思ったんですが、調べたところ、declare(strict_types = 1);というオプションがあって、それを書くと、buyCoffee('blend', '9.0'); にもエラーが出ます。

個人的には、declare(strict_types = 1);をデフォルトにしてもいいのでは?

戻り値のタイプヒント

PHP7からは戻り値のタイプの指定もできるようになります。

function ImReturnString() : string
{
return 8;
}
echo ImReturnString();

パフォーマンス

PHP7では配列のパフォーマンスが大きく改善されたと聞きましたが、実際にテストしてみました。

<?php
$now = microtime(true);
function result($now)
{
echo 'MEMORY USAGE: ' . (memory_get_usage() / 1024 / 1024) . ' MB' . "\n";
echo 'USED TIME: ' . (microtime(true) - $now) . "\n";
}
$i = range(0, 1000000);
// 百万要素の配列を作成
result($now);
echo '----------------------' . "\n";
// ハッシュテーブルを作成
$new = array();
foreach ($i as $i_)
{
$k = 'key' . $i_;
$new[$k] = $i_;
}
result($now);

結果は:

// PHP5.6.2
MEMORY USAGE: 137.91467285156 MB
USED TIME: 0.16725087165833
----------------------
MEMORY USAGE: 245.02112579346 MB
USED TIME: 0.6604278087616
// PHP7.0.0-dev
MEMORY USAGE: 32.339584350586 MB
USED TIME: 0.013984203338623
----------------------
MEMORY USAGE: 106.41040802002 MB
USED TIME: 0.3082160949707

配列を宣言する際にPHP7のメモリーの使用量はPHP5より半分以下抑えている上、パフォーマンスが2〜10倍向上しています

まとめ

PHP7のリリースはまだ時間かかりそうですが、今使いたい機能もいくつがあってなかなか期待できそうではないかと思います。