eval() は引数で指定した文字列を、PHPスクリプトとみなして実行します。
<?php $str = 'echo "Hello!\n";'; eval($str);
__halt_compiler()は、PHPスクリプトの解釈(コンパイル)を中止します。PHPスクリプトの末尾にデータを埋め込む際に利用されます。末尾データの先頭は、__COMPILER_HALT_OFFSET__ で参照できます。
<?php $fp = fopen(__FILE__, "r"); fseek($fp, __COMPILER_HALT_OFFSET__); echo stream_get_contents($fp); // ABCDEFG...が出力される __halt_compiler();ABCDEFG HIJKLMN
PHP5.3 で名前空間の機能が追加されました。例えば、下記のファイル構成で、A社が作成した foo ライブラリと、B社が作成した bar ライブラリでクラス名や関数名が重複していると、test.php からこれらを使用することができません。
test.php lib foo.php bar.php
この問題を解決するため、namespace を用いて名前空間を指定します。foo.php、bar.php を下記の様に作成します。lib と foo の間はバックスラッシュ(\)です。
<?php namespace lib\foo; class MyClass { function __construct() { echo "MyClass of foo\n"; } } function MyFunction() { echo "MyFunction of foo\n"; } const MyConst = "MyConst of foo\n";
<?php namespace lib\bar; class MyClass { function __construct() { echo "MyClass of bar\n"; } } function MyFunction() { echo "MyFunction of bar\n"; } const MyConst = "MyConst of bar\n";
こうすると、MyClass, MyFunction, MyConst などの名称は、lib\foo\MyClass, lib\foo\MyFunction, lib\foo\MyConst などのように参照することが可能となります。
<?php require "lib/foo.php"; require "lib/bar.php"; $obj1 = new lib\foo\MyClass(); $obj2 = new lib\bar\MyClass(); lib\foo\MyFunction(); lib\bar\MyFunction(); echo lib\foo\MyConst; echo lib\bar\MyConst;
use as を用いることで、名前空間に別名をつけることができます。下記の例では、lib\foo に対して foolib という別名をつけています。as 以降は省略可能です。
<?php require "lib/foo.php"; require "lib/bar.php"; use lib\foo as foolib; use lib\bar; // use lib\bar as bar; と解釈される $obj1 = new foolib\MyClass(); foolib\MyFunction(); echo foolib\MyConst; $obj2 = new bar\MyClass(); bar\MyFunction(); echo bar\MyConst;
namespace { ... } の形式で名前空間を指定することもできます。名前を省略するとグローバル名前空間となります。
<?php namespace lib\foo { function func() { echo "lib\\foo\\func()\n"; } } namespace lib\bar { function func() { echo "lib\\bar\\func()\n"; } } namespace { lib\foo\func(); lib\bar\func(); }
namespace, __NAMESPACE__ は、現在の名前空間を示します。
<?php namespace lib\foo { function func() { echo "lib\\foo\\func()\n"; } } namespace lib\bar { function func() { echo "lib\\bar\\func()\n"; } } namespace lib { namespace\foo\func(); // lib\foo\func() namespace\bar\func(); // lib\bar\func() echo __NAMESPACE__; // lib }
declare は、プログラム全般に関わる宣言を指定します。下記の2つの記述方法があります。
<?php declare(ticks=1) { // この箇所に記述したプログラムに対して有効 } declare(ticks=1); // ファイルの末尾までのプログラムに対して有効
ticks=N は、処理系が N個の命令を実行する毎に、register_tick_function() で指定した関数を実行します。
declare(ticks=10); register_tick_function(function() { echo "X"; }); for ($i = 0; $i < 100; $i++) { echo "o"; // ooooXooooXooooXooooX....と表示される }
encoding は、スクリプトのエンコーディングを指定します。
declare(encoding='UTF-8'); // UTF-8で記述されたプログラム...