名前空間と動的言語機能

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PHP における名前空間の実装は、PHP 自身が動的プログラミング言語であるという性質に影響を受けています。 したがって、次の例のようなコードを名前空間を使って書き直すには

例1 要素への動的なアクセス

example1.php:

<?php
class 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 名前空間つき要素への動的なアクセス

<?php
namespace 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 と表示します
?>

文字列中の名前空間名のエスケープに関する注意 を読んでおくことを忘れないようにしましょう。

関連キーワード:  機能, 修飾, 要素, 定数, クラス, アクセス, エスケープ, 先頭, 関数, プレフィックス