名前空間と動的言語機能
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
PHP における名前空間の実装は、PHP 自身が動的プログラミング言語であるという性質に影響を受けています。 したがって、次の例のようなコードを名前空間を使って書き直すには
例1 要素への動的なアクセス
example1.php:
<?phpclass classname{ function __construct() { echo __METHOD__,"\n"; }}function funcname(){ echo __FUNCTION__,"\n";}const constname = "global";$a = 'classname';$obj = new $a; // classname::__construct と表示します$b = 'funcname';$b(); // funcname と表示しますecho constant('constname'), "\n"; // global と表示します?>
完全修飾名 (クラス名に名前空間プレフィックスをつけたもの) を使う必要があります。 動的なクラス名、関数名あるいは定数名においては修飾名と完全修飾名に差はないので、 先頭のバックスラッシュはなくてもかまいません。
例2 名前空間つき要素への動的なアクセス
<?phpnamespace namespacename;class classname{ function __construct() { echo __METHOD__,"\n"; }}function funcname(){ echo __FUNCTION__,"\n";}const constname = "namespaced";/* ダブルクォートを使う場合は "\\namespacename\\classname" としなければなりません */$a = '\namespacename\classname';$obj = new $a; // namespacename\classname::__construct と表示します$a = 'namespacename\classname';$obj = new $a; // これも namespacename\classname::__construct と表示します$b = 'namespacename\funcname';$b(); // namespacename\funcname と表示します$b = '\namespacename\funcname';$b(); // これも namespacename\funcname と表示しますecho constant('\namespacename\constname'), "\n"; // namespaced と表示しますecho constant('namespacename\constname'), "\n"; // これも namespaced と表示します?>
文字列中の名前空間名のエスケープに関する注意 を読んでおくことを忘れないようにしましょう。