アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPのグローバル空間において
useキーワードを用いた際のインポートについて質問です。
----------------------------------------------------------------------------------------------------------
sample.php
<?php

//グローバル空間
namespace{
use SAMPLE;//はインポートできない。 use ¥SAMPLEはインポートできる。
print "名前空間のインポート";
print PHP_EOL;
$hoge = new SAMPLE\TestClass();
}

//任意の名前空間
namespace SAMPLE{
class TestClass{
public function __construct (){
print __NAMESPACE__;
}
}
}
----------------------------------------------------------------------------------------------------------
とあった場合、グローバル空間内でuseキーワードを用いる場合
use ¥SAMPLE;
だとインポートができて
use SAMPLE:
だとインポートできない理由(というか仕様)が理解できません。
具体的には
PHP Warning: The use statement with non-compound name 'SAMPLE' has no effect in
という警告がでます。

上記の例の場合たとえ
use ¥SAMPLEでインポートしても
実際にクラスを使用する場合は
new SAMPLE¥TestClass();
と修飾名でコールしなければならないので
コードを書く労力としてはあまり意味がないのですが。。。。。

どなたか
グローバル空間内で上記の様に
use ¥SAMPLEだとインポートできるのに
use SAMPLEだとインポートできない理由(仕様)、このように理解すればよいという理由を
ご教授ください。よろしくお願いします。

A 回答 (1件)

インポートはできてます。


でているのは警告で、no effectと書いてありますので、効果が無い、ということです。
「¥」のないものは非修飾名というものになり、確かに、SAMPLEという名前空間をuseしても、エイリアスを貼る効果はありません。

namespace SAMPLE\Foo{

class Example{
public functoin test(){
echo "test";
}
}

}

と合った場合に、
use SAMPLE\Foo;

$obj = new Foo\Example();

とするとエラーは出てこないと思います。SAMPLEの部分を記述しなくても呼び出せるのでエイリアスを貼る意味はあったと。

で、
use \SAMPLEとした時に警告が出てこない理由は、完全修飾名だからです。

http://www.php.net/manual/ja/language.namespaces …

こちらを見ていただくと、
「¥」で区切られていない記述は、非修飾名であり、「¥」を含まれている記述は修飾名となりますが、
先頭に「¥」がある場合は、ソレが先頭以外で非修飾名でも修飾名でも「完全修飾名」とみなされます。

その為、useで警告がでないということになります。
    • good
    • 0

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