在编程语言中使用'use'或'using'

时间:2012-04-08 13:00:51

标签: php namespaces

我一直认为命名空间的主要目标是防止名称冲突和歧义。

来自php.net的名称空间修复的#1>#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'来获得简短名称,那么这比仅仅在全局命名空间中声明类更好吗?见下文:

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();
}

这两者之间是否存在任何差异?

1 个答案:

答案 0 :(得分: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而不是'使用'来破坏命名空间的目的< / p>