dポイントプレゼントキャンペーン実施中!

以下のようなコードがあるとします。
<?php
namespace {
print_r(get_declared_classes());
}

namespace A\B\C{
print_r(get_declared_classes());
}
?>

この場合は問題なく実行されるのですが
以下のようなコードになった場合名前空間A\\B\\Cのコード内にある
ArrayObjectがみつからないというfatalerrorがでます。
<?php
namespace {
print_r(get_declared_classes());
$noneObj = new ArrayObject(array("key01" => "グローバル空間"));
print $noneObj["key01"];
}

namespace A\B\C{
print_r(get_declared_classes());
$abcObj = new ArrayObject(array("key01" => "名前空間 ABC"));
print $abcObj["key01"];
}
?>

これはどういうことなのでしょうか?
組み込みの関数は特定の名前空間内でも被修飾名にて呼び出せるにもかかわらず
組み込みのクラスはなぜか絶対修飾名でないとクラスを呼ぶことができません。

この理由をご教授ください。
よろしく御願いします。

A 回答 (1件)

>これはどういうことなのでしょうか?


それが名前解決のルールだから、ということではないでしょうか。

関数の場合、名前空間内にその関数が存在しなければ次にグローバル空間を探す。
一方クラスの場合は、名前空間内で見つからなければautoloadを試みる。(グローバル空間を探すことはしない)ということになっています。
http://www.php.net/manual/ja/language.namespaces …

まあ妥当なルールではないかと。__autoload(又はspl_autoload_register)で定義しておけばクラスを使用するのに逐一includeしないで済みますし。あるいはグローバル以外で内部関数を使用するのに\していくのも不自由ですしね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!