PHP5.4の最新機能
公式サイト:ChangeLog-5.php#5.4.0
オリジナルの Oracle: LAMP システムには新たな競合相手がいますが、このバージョンの機能により PHP は再び限界に挑戦します。 少し修正しました。 :
概要の要約:
1. メモリとパフォーマンスの向上: 大規模な PHP アプリケーションでのメモリの 20 ~ 50% の節約。さまざまな最適化によりパフォーマンスが 10 ~ 30% 向上します
2. サポート特性
3. 配列構文が簡略化され、短い配列を定義できます
4. 関数配列の逆参照、配列の逆参照をサポート、
5. インスタンスメソッド呼び出し
6. クロージャーバインディング
7. オブジェクトは関数です
8. 組み込み Web サーバー (CLI)
9. ネイティブセッションハンドラーインターフェース
10. JsonSerializable インターフェース
11. バイナリ表現
12. エラーメッセージの改善
13. 配列から文字列への変換通知
14. 関数型ヒントの強化 (Callable typehint)
15. 時間統計の強化、高精度タイマー
16. アップロード進行状況バーアップロード進行状況
17. PHP 5.4 の Zend シグナル
18. PHP 5.4 では、Arnaud による三項式の最適化スキームが導入されました。
1) 非推奨:allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat42、session.bug_compat_warn、および y2k_compliance。
2) PHP の Break および continue 変数構文はサポートされなくなりました
3) mysqlnd このバンドルされた MySQL ネイティブ ドライバー ライブラリは、コンパイル時に ./configure によって明示的にオーバーライドされない限り、MySQL と通信するさまざまな拡張機能にデフォルトで使用されるようになりました。
約 8 年前、私は Oracle Technology Network に「PHP を知っていますか?」という記事を書きました。その記事では、「Web の問題」に対する PHP の頑固な形式より関数のアプローチと、物事を容易にする PHP の能力について話しました。当時、私たちは PHP 5.0 をリリースしようとしていたところでした。約10年の時を経て、新たに新商品を発売します。 PHP 5.4.0 バージョンでは、この間に多くのことが起こりましたが、多くの点はまったく変わっていません。
変わらないことの 1 つは、エコシステムがこれまでと同様に重要であるということです。 Web の問題を解決するには、スクリプト言語の選択だけが重要ではなく、その言語を取り巻くエコシステム全体が重要です。 LAMP システムは誕生から 15 年近く経ちますが、依然として人気がありますが、他の強力なオプションにも気づき始めています。 nginx を使用した PHP-FPM は、PHP 5.3 からサポートが大幅に改善され、5.4 でさらに簡素化されて以来、急速に人気を集めています。システムの M (データベース) 部分も、8 年前とは大きく変わり始めています。すべてを MyISAM テーブル、さまざまな NoSQL ソリューション、MySQL Cluster に配置するだけと比較した場合 より豊富な選択肢を提供します。
多くの興味深いテクノロジーが出現しているため、それらに簡単にアクセスできるように PHP 拡張機能を作成しました。私のお気に入りの拡張機能の 1 つは、 libevent を使用すると、PHP でイベント駆動型の高性能アプリケーションを作成できます。もう一つは ZeroMQ、高度なソケット ライブラリ。 SQLite では、別の生のファイル形式や関連するパーサーを作成する必要がなくなるのと同様に、ZeroMQ では、何らかの理由でソケット プロトコルや関連するソケット処理コードを使用する必要がなくなります。 libevent と ZeroMQ を組み合わせて、スタンドアロンの高性能イベント駆動型サーバーを構築することもできます。 (興味があればこの例を参照してください。) 私は機械学習アルゴリズムである SVM (サポート ベクター マシン) の大ファンでもあります。多くの質問をするのに機械学習の愛好家である必要はありません。
近年、広く受け入れられるようになった拡張機能が数多くあります。特に、Gearman は人気を博し、ユーザーによって展開される共通スタックの一部になりました。 Gearman を通じてジョブをディスパッチして、ワーカーによって非同期で完了するようにすることができます。ワーカーは複数のサーバーに分散でき、さらに多くの MapReduce タイプのジョブをディスパッチすることもできます。
PHP 5.0 が 2004 年にリリースされた後、5.1 が 2005 年にリリースされました。このバージョンには、DateTime の実装、PDO、およびパフォーマンスの改善が追加されました。 PHP 5.2 は 2006 年にリリースされ、改良されたメモリ マネージャー、JSON サポート、入力フィルタリングが導入されました。当時、私たちは PHP 6 の推進に着手しました。これは、ICU (Internationalization Components for Unicode) ライブラリに関するすべてを完全に書き直すという非常に野心的な計画です。この計画は少し急ぎすぎたことが判明しました。十分な開発者を興奮させることができず、最終的には PHP 6 向けのさまざまな機能を 2009 年にリリースされた PHP 5.3 に追加することになりました。 真ん中。バージョン 5.2 と 5.3 の間には 3 年のギャップがあります。これは、5.3 が PHP に多くのコンテンツ (名前空間、遅延静的バインディング、クロージャ、ガベージ コレクション、制限付き goto、mysqlnd (MySQL ネイティブ ドライバー)、およびより優れた Windows) を追加していることも意味します。パフォーマンスやその他多くのこと。
今にして思えば、このバージョンを PHP 6 と呼ぶのはある程度の真実があるかもしれませんが、PHP 6 は Unicode に関する本が書かれるほどの努力をしたものであるため、Unicode に対して何も行われていなかったら PHP 6 は実現できないと考えています。大きな改良を加えずにリリースされました。 「intl」と呼ばれる ICU 拡張機能を導入しました。これも PHP 5.2 に対してコンパイルされ、より多くの ICU 機能にアクセスできるようになります。 mbstring 拡張機能は時間の経過とともに改善され続けています。つまり、ほとんどすべての Unicode 関連の問題には解決策がありますが、言語自体に明示的に統合されていないだけです。
これが、2012 年に PHP 5.4 がリリースされた方法です。そして、前回のバージョンから約 3 年が経過しているため、その間にいくつかの改良を加えてきました。むしろ、1 年に 1 回のリリースに戻し、各リリースに含まれる新機能の数を減らしたいと考えています。
5.4 にアップグレードすると表示される主な機能は次のとおりです:
多くの内部構造が小さくなったり、完全に消えたりした結果、大規模な PHP アプリケーションでは 20 ~ 50% のメモリが節約されます。さまざまな共通コード パスのインライン化、JIT への $GLOBALS の追加、「@」演算子の高速化、ランタイム クラス/関数/定数キャッシュの追加、ランタイムなどのさまざまな最適化により、パフォーマンスが 10 ~ 30% 向上します (主にコードの動作に応じて)。文字列定数が保持されるようになり、事前計算されたハッシュを介した定数へのアクセスが高速になり、空の配列が高速になり使用メモリが減り、unserialize() と FastCGI リクエストの処理が高速になり、コード全体のメモリとパフォーマンスの調整が強化されました。
たとえば、いくつかの初期テストでは、5.4 では Zend Framework が 21% 高速に動作し、使用するメモリが 23% 少ないことが示されています。一方、Drupal は、50% 少ないメモリ使用で、約 7% 高速に動作します。
トレイトはおそらく PHP 5.4 で最も話題になっている機能です。トレイトはコンパイラ支援のコピーアンドペーストと考えてください。トレイトも Scala の機能です。他の言語ではそれらを「ミックスイン」と呼ぶ場合があります。または、これらの言語では名前をまったく付けない場合もありますが、インターフェイスにそのメソッドの実際の実装を含めることを可能にする拡張インターフェイス メカニズムを備えています。
ミックスインとは対照的に、PHP のトレイトには、複数のトレイトが同じメソッドを実装する場合に備えて、明示的な競合解決メカニズムが含まれています。
trait Singleton { public static function getInstance() { ... } } class A { use Singleton; // ... } class B extends ArrayObject { use Singleton; // ... } // Singleton method is now available for both classes A::getInstance(); B::getInstance();
競合解決構文、メソッドの優先順位、可視性、特性の定数とプロパティのサポートなど、その他の例については、php.net/traits を参照してください。さらに、概念理論について詳しく知りたい場合は、Nathan Schörli の論文「Traits: Compositional Classes in Behavioral Building Blocks」を読むことができます。
シンプルだが非常に人気のある新しい構文:
$a = [1, 2, 3]; $b = ['foo' => 'orange', 'bar' => 'apple'];
つまり、配列を定義するために「array」キーワードを使用する必要がなくなりました。
1) 別の新しい共通構文が追加されました。配列を返す関数呼び出しを直接逆参照できるようになりました:
function fruits() { return ['apple', 'banana', 'orange']; } echo fruits()[0]; // Outputs: apple
2) 配列の逆参照を使用すると、以前の書き込み方法は必要なくなります。
関数配列の参照解除に関連して、オブジェクトのインスタンス化メソッドを呼び出すことができるようになりました。以前のバージョンと同様に、もちろんメソッド呼び出しを連鎖させることができるため、次のようなコードを記述できるようになりました:
class foo { public $x = 1; public function getX() { return $this->x; } public function setX($val) { $this->x = $val; return $this; } } $X = (new foo)->setX(20)->getX(); echo $X; // 20 <p></p> <p>ただし、インスタンス化されたオブジェクトは破棄される可能性があるため、コンストラクターが何か有用な処理をしない限り、ここでは代わりに静的メソッド呼び出しを使用する必要があります。これを圧縮配列構文と関数配列の参照解除と組み合わせると、非常に複雑なコードを作成できます。</p> <p><span style="font-family:'Courier New'"></span></p> <pre name="code" class="php">class foo extends ArrayObject { public function __construct($arr) { parent::__construct($arr); } } echo (new foo( [1, [4, 5], 3] ))[1][0];
これを見て、出力が何であるかわかりますか?ここでは、配列を返すだけのコンストラクターに 2D 配列を渡します。次に、2 番目の次元の最初の要素を選択します。これにより、「4」が出力されます。
クロージャは PHP 5.3 で導入されましたが、5.4 ではクロージャがオブジェクトと対話する方法が改善されました。例:
class Foo { private $prop; function __construct($prop) { $this->prop = $prop; } public function getPrinter() { return function() { echo ucfirst($this->prop); }; } } $a = new Foo('bar');; $func = $a->getPrinter(); $func(); // Outputs: Bar
注意闭包访问 $this->prop 这一私有属性。默认情况下,PHP 中的闭包使用预绑定 ― 这意味着闭包内的变量具有定义闭包时所具有的值。可以使用引用将其转换为后绑定。但是,也可以重新绑定闭包:
$a = new Foo('bar'); $b = new Foo('pickle'); $func = $a->getPrinter(); $func(); // Outputs: Bar $func = $func->bindTo($b); $func(); // Outputs: Pickle
在此,我们将闭包从 $a 实例重新绑定到 $b 中的实例。如果您不希望闭包随时访问对象实例,可以将闭包声明为静态:
class Foo { private $prop; function __construct($prop) { $this->prop = $prop; } public function getPrinter() { return static function() { echo ucfirst($this->prop); }; } } $a = new Foo('bar');; $func = $a->getPrinter(); $func(); // Fatal error: Using $this when not in object context
有一种新的神奇方法,名为“__invoke”,其用法如下:
class MoneyObject { private $value; function __construct($val) { $this->value = $val; } function __invoke() { return sprintf('$%.2f',$this->value); } } $Money = new MoneyObject(11.02/5*13); echo $Money(); // Outputs: $28.65
CLI 服务器是一种小型 Web 服务器实现,可以从命令行运行:
% php -S localhost:8000 PHP 5.4.0 Development Server started at Sun Mar 11 13:27:09 2012 Listening on localhost:8080 Document root is /home/rasmus Press Ctrl-C to quit.
CLI 服务器不适合用作生产 Web 服务器;我们将使用它运行一些 PHP 回归测试,其他单元测试机制也可使用它,并且 IDE 也可能使用它。它确实具有一些很有用的特性,用于从命令行进行日常代码调试。默认情况下,它使用当前目录作为 DocumentRoot;它也处理静态文件请求。默认目录索引文件为“index.php”,因此您可以在满含 .php、.css、.jpg 等文件的目录中激活它,它自己就可以运行。对于可能使用 mod_rewrite 将所有请求发送到前端控制器或路由器的更复杂应用程序,您可以将此路由器与一个简单的小脚本包装在一起,并启动
CLI 服务器,如下所示:
% php -S localhost:8080 /path/to/router.php PHP 5.4.0 Development Server started at Sun Mar 11 13:28:01 2012 Listening on localhost:8080 Document root is /tmp/web Press Ctrl-C to quit.
router.php 脚本可能如下所示:
<?php if (preg_match('!\.php$!', $_SERVER["REQUEST_URI"])) { require basename($_SERVER["REQUEST_URI"]); } else if (strpos($_SERVER["REQUEST_URI"], '.')) { return false; // serve the requested file as-is. } else { Framework::Router($_SERVER["REQUEST_URI"]); }
此包装器加载直接 .php 请求,将包含“.”的任何其他请求传递到静态文件处理程序,其他所有内容都传递到框架的路由器。您可以如此直接从命令行运行 Drupal 和 Symphony。
这是一个小而方便的特性,现在可以用它实现会话处理程序接口。现在,您可以仅将会话处理对象的实例传递给 session_set_save_handler(),而不必传递给它六个比较麻烦的函数:
SessionHandler implements SessionHandlerInterface { public int close ( void ) public int destroy ( string $sessionid ) public int gc ( int $maxlifetime ) public int open ( string $save_path , string $sessionid ) public string read ( string $sessionid ) public int write ( string $sessionid , string $sessiondata ) } session_set_save_handler(new MySessionHandler);
现在,您可以通过实现 JsonSerializable 接口来控制有人尝试使用 json_encode() 对您的对象进行编码时所发生的情况:
class Foo implements JsonSerializable { private $data = 'Bar'; public function jsonSerialize() { return array('data'=>$this->data); } } echo json_encode(new Foo); // Outputs: {"data":"Bar"}
为了与 PHP 的原生十六进制和八进制支持协调一致,现在也支持二进制表示法:采用“0b”前缀标识二进制数
$mask = 0b010101;
错误消息稍有改进。
改进前:
% php -r 'class abc foo' Parse error: syntax error, unexpected T_STRING, expecting '{' in Command line code on line 1
改进后:
% php -r 'class abc foo' Parse error: syntax error, unexpected 'foo' (T_STRING), expecting '{' in Command line code on line
改进可能不十分明显,但区别是现在已在错误消息中显示偏移标记“foo”的值。
如果您一直使用 PHP,则可能以随机出现在页面中“Array”一词结束编程,因为您尝试直接输出数组。每当将数组直接转换为字符串时,都很有可能出现错误,现在有了一个针对这一情况的通知:
$a = [1,2,3]; echo $a;
注意:数组到字符串转换在 example.php onlLine 2 中
14. 函数类型提示的增强,(Callable typehint)
由于php是弱类型的语言,因此在php 5.0后,引入了函数类型提示的功能,支持对象和数组,其含义为对于传入函数中的参数都进行类型检查,举个例子,有如下的类:
class bar { } function foo(bar $foo) { }其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:
function foo(array $foo) { } foo(array ( 1, 2, 3 )); // 正确,因为传入的是数组 foo(123); // 不正确,传入的不是数组 function my_function(callable $x) { return $x(); }
function foo(callable $callback) { }则:
foo("false"); //错误,因为false不是callable类型 foo("printf"); //正确 foo(function () { }); //正确 class A { static function show() { } } foo(array ( "A", "show" )); //正确遗憾的是,PHP 5.4中,依然不支持对基本类型如字符,整形等的类型提示。
此次引入了$_SERVER['REQUEST_TIME_FLOAT']数组变量,微秒级精度(百万分之一秒,float类型)。对于统计脚本运行时间会非常有用:
echo 'Executed in ', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2)
16. 上传进度条Upload progress
文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在PHP5.4以前, 我们可以通过APC提供的功能来实现. 或者使用PECL扩展uploadprogress来实现.
虽然说, 它们能很好的解决现在的问题, 但是也有很明显的不足:
从PHP的角度来说, 最好的储存这些信息的地方应该是SESSION, 首先它是PHP原生支持的机制. 其次, 它可以被配置到存放到任何地方(支持多机共享).
正因为此, Arnaud Le Blanc提出了针对Session报告上传进度的RFC, 并且现在实现也已经包含在了PHP5.4的主干中。
通过$_SESSION["upload_progress_name"]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
在PHP5.4中, 根据由Rasmus提交的RFC, 引入了一套新的信号处理机制, 目的是为了使得信号屏蔽机制可以应用到任何SAPI中, 并且提高在这个过程中的PHP性能.
新的机制, 叫做zend signal, 它的理念, 来自Yahoo的”延迟信号处理”(Yahoo signal deferring mechanism), 而后, facebook把这套理念加入了PHP中, 为了提升PHP+Apache 1.X下PHP调用ap_block/ap_unblock的性能.
18. PHP 5.4 由Arnaud 引入了一个对三元式的优化方案.
我们都知道PHP用写时复制来对变量复制做性能优化, 而在以前的三元式中, 却每次都会复制, 这在操作数是大数组的情况下, 会造成性能问题:
<?php $a = range(1, 1000); $i = 0; $start = microtime(true); while (++$i < 1000) { $b = isset($a)? $a : NULL; } var_dump(microtime(true) - $start);
1)最后,我们集中整理了几年来标记为已弃用的多个特性。这些特性包括 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat42、session.bug_compat_warn 以及 y2k_compliance。
2) 备受指责的 Register Globals 已从 PHP 中完全删除。十年来,该特性一直以其频繁发生的安全漏洞而著称。2002年该特性被设置为默认关闭。2009年发布的 PHP5.3 将该特性标记为“弃用”,想必从那时起,大部分开发人员已经不再使用它。
3)除了这些特性之外,magic_quotes 可能是最大的危险。在早期版本中,未考虑因 magic_quotes 出错导致的后果,简单编写且未采取任何举措使自身免受 SQL 注入攻击的应用程序都通过 magic_quotes 来保护。如果在升级到 PHP 5.4 时未验证已采取正确的 SQLi 保护措施,则可能导致安全漏洞。
4)PHP 中的 break 和continue 语句之后可以跟上一个参数用来指明跳出的循环层数。如果不指定参数,它会像 VB、C#或 Java 一样跳出最内层的循环。在 PHP 5.4 之前,开发人员可以向 break 语句传递一个变量,而现在只能传递常量。
5)PHP 允许参数按引用传递。在早期版本中,你可以通过为调用点添加修饰来指明变量按引用传递。在 PHP 5.4 中,该选项已被移除。相反,现代 PHP 编程只需要在函数声明时指定按引用传递即可。与 C# 不同,你不需要同时在声明和调用点指定按引用传递。
有一种新的“可调用的”类型提示,用于某方法采用回调作为参数的情况。
htmlspecialchars() 和 htmlentities() 现在可更好地支持亚洲字符,如果未在 php.ini 文件中显式设置 PHP default_charset,这两个函数默认使用 UTF-8 而不是 ISO-8859-1。
=(精简回显语法)现在始终可用,无论 short_tags ini 设置的值为何。这应该使模板化系统创建者感到满意。
会话 ID 现在默认通过 /dev/urandom(或等效文件)中的熵生成,而不是与早期版本一样成为必须显式启用的一个选项。
mysqlnd 这一捆绑的 MySQL 原生驱动程序库现在默认用于与 MySQL 通信的各种扩展,除非在编译时通过 ./configure 被显式覆盖。
おそらくさらに 100 個の小さな変更と機能が追加されます。 PHP 5.3 から 5.4 へのアップグレードは非常にスムーズですが、移行ガイドを読んで確認してください。以前のバージョンからアップグレードする場合は、もう少し作業が必要になる場合があります。アップグレードを開始する前に、以前の移行ガイドを確認してください。
PHP については長期的な計画はありません。 PHP は Web とともに進化します。 5 ~ 10 年後に重要な Web トレンドやテクノロジーがどうなっているかはわかりませんが、私たちの継続的な努力により、PHP が確実に存在することはわかっています。
短期的には、「社内」メーリング リストを通じて PHP 開発について議論し、大きな機能が合意されると、RFC に発展します。 RFC は wiki.php.net/rfc にあります。素晴らしい新機能セットのリリースに投票し、それらが適切に実装およびテストされた後、新しいリリースの準備を開始します。
PHP は Web とともに成長し、安定した市場シェアを維持しており、世界中のすべての Web サイトの約 3 分の 1 で使用されています。これらには、大規模な Web サイトの一部だけでなく、小規模な Web サイトの大部分も含まれます。私は最小限の Web サイトに PHP だけをセットアップしました。スケーリングは自然であり、予想されていることでさえあり、エンジニアにとって非常に魅力的な機能ですが、スケールダウンは通常ではなく、場合によってはより困難です。適切なバランスを見つけて、寮の部屋のレンタルや数十億ドル規模の企業でも同じコード ベースを使用できるのであれば、あなたはその言語を真にマスターしたことになります。
PHP 5.4 バージョンは、Windows XP および Windows 2003 をサポートする最後のバージョンとなり、これらのオペレーティング システム 用のバイナリ パッケージは将来提供されなくなります。
PHP 5.4 は、Windows XP および Windows2003 をサポートする最後のシリーズになります。PHP 5.4 以降は、これらの Windows バージョン用のバイナリ パッケージは提供されません。