11

名前空間の主な目的は、名前の衝突やあいまいさを防ぐことだといつも思っていました。

php.netの名前空間によって修正された#1の問題:

作成したコードと、内部PHPクラス/関数/定数またはサードパーティのクラス/関数/定数との間の名前の衝突。

ただし、ほとんどの言語は、他の名前空間を現在の名前空間にエイリアスまたはインポートするために、何らかの方法で「use」キーワードを実装しています。それがどのように機能するかは知っていますが、なぜそのような機能が使用されるのかわかりません。

'use'キーワードを使用すると、名前空間の目的が効果的に無効になりませんか?

namespace core\utils;

class User {
    public static function hello(){
        return "Hello from core!";
    }
}
//---------------------------------------------------

namespace core2\utils;

class User {
    public static function hello(){
        return "Hello from core2!";
    }
}
//---------------------------------------------------

namespace core2;

//causes name collision, we now have two different classes of type 'utils\User'
use core\utils; //without this line the result is 'Hello from core2'

class Main {
    public static function main(){
        echo utils\User::hello();
    }
}

Main::main();
//outputs Hello from core!
?>

私は何かが足りないのですか、それとも「use」キーワードの使用は本当に一般的に推奨されていませんか?

いずれにせよ、どのような状況下でカプセル化を犠牲にするのが実際に良い考えですか?

以前はuseを使用していましたが、いつ使用すべきかわかりません。

編集:わかりました。これをまっすぐにしましょう。「use」を使用して短い名前を取得する場合、グローバル名前空間でクラスを宣言するよりも優れていますか?下記参照:

namespace core\utils\longname {    
    class User {} //declare our class in some namespace
}

//------------------Other File---------------------------
namespace { //in another file import our long name ns and use the class
    use core\utils\longname\User as User;
    new User();
}

^この宣言に対するそのような名前空間の利点は何ですか:

namespace {    
    class User {} //declare our class in global namespace
}

//------------------Other File---------------------------
namespace { //in another file just use the class
    new User();
}

2つの間にまったく違いはありますか?

4

1 に答える 1

3

+1非常に興味深い質問

私の意見

use非常に多くの用途と機能がこれを想像するキーワード

use core\utils\sms\gateway\clickatell\http\SmsSender  as SmsCSender 
use core\utils\sms\gateway\fastSMS\ftp\Smssender as SmsFSender 

今比較

if(!SmsCSender::send($sms))
{
    SmsFSender::send($sms);
}

if(!core\utils\sms\gateway\clickatell\http\SmsSender::send($sms))
{
    core\utils\sms\gateway\fastSMS\ftp\SmsSender::send($sms);
}

結論

そうでなければnamespaceuse私はそのようなクリーンで読みやすいコードを達成することができないので、私が思うのはnamespace and use complement each other 、名前空間の目的を「使用」するのではなく、

于 2012-04-08T13:20:16.403 に答える