在PHP中将类名命名为MyClass和名称空间\ Myclass有什么区别?

问题描述:

我是PHP新手。我只是想了解PHP命名空间,并坚持要改变类名称,我指的是这篇文章标题为How to use PHP namespace。并在该页面上引用下面的代码。在PHP中将类名命名为MyClass和名称空间 Myclass有什么区别?

<?php 
namespace App\Lib1; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 

$c = __NAMESPACE__ . '\\MyClass'; 
$m = new $c; 
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI 
?> 

在上面的代码,我想,他们已经创建的对象等,

$c = __NAMESPACE__ . '\\MyClass'; 
$m = new $c; 

我想对象可以被创建在上述情况下那样简单,

$m = new MyClass(); 

而关于在其他代码中已使用代码创建对象,

$m = new namespace\MyClass; 

现在,如果我比较以上所有三种,我找到两种创建类名称1的方法。$m = new MyClass();和2. $m = namespace\MyClass;。我想知道使用$m = namespace\MyClass;有何区别和目的?非常感谢提前。

在PHP中使用名称空间的最大优点是当您有多个具有相同名称的类时。没有名称空间,开发人员需要担心通过创建类MyClass,还有数千个其他第三方库也可能具有MyClass。

假设您想创建一个名为DateTime的类。如果您只是在没有命名空间的情况下编写该函数,则会与PHP的DateTime类发生冲突。通过声明一个命名空间,你可以对代码进行分类。

<?php 

$myObject = DateTime(); // This statement creates an object using PHP's implementation of DateTime 

namespace Foo\DateTime; 
use Foo\DateTime as DateTime; 

$myObject = DateTime(); // This statement will use the custom class from the Foo\DateTime namespace 

$myObject = PHP\DateTime(); // This statement will use PHP's class even though you're using the Foo\DateTime namespace 

?> 

第二个优点是代码简洁。如果您使用上面显示的Foo \ DateTime命名空间,则在您从类中创建自定义对象时,不必使用完全限定名称。当您必须创建大量的自定义类的实例时,这非常有用。

当您使用像这样的命名空间,你可以把它写成一个别名,而不是一个完全合格的名称:

use Foo\DateTime as DateTime; 
$myObject = new DateTime(); 

不使用命名空间,你需要创建对象,像这样,如果你想使用您的DateTime类,而不是PHP的DateTime类:

$myObject = Foo\DateTime(); 

我想有间没有任何本质上的区别:

$m = new MyClass();$m = new namespace\MyClass;

它可以帮助你明确地说明两个类具有相同名称的一个你使用的:

<?php 
namespace Foo; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 
?> 

<?php 
namespace Bar; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 
?> 

<?php 
namespace Bar; 
use Foo; 

$obj1 = new MyClass; 
var_dump($obj1->WhoAmI()); //Bar\MyClass::WhoAmI 

$obj2 = new namespace\MyClass; 
var_dump($obj2->WhoAmI()); //Bar\MyClass::WhoAmI 

$obj3 = new Foo\MyClass; 
var_dump($obj3->WhoAmI()); //Foo\MyClass::WhoAmI 

我认为在这种情况下最好使用aliasing

+0

是的,这是真的,都被赋予了相同的输出。感谢您的链接,我指的是链接,并试图了解整个系统,将发布后评论。谢谢 – codenext