为什么我在没有使用Bar
的完全限定名称的情况下收到错误?
Foo.php
<?php
namespace Bla\Bla;
require '../../vendor/autoload.php';
class Foo
{
public function getBar()
{
$className="Bar";
$fullClassName='\Bla\Bla\\'.$className;
$obj1=new Bar(); //Works
$obj2=new $fullClassName(); //Works
$obj3=new $className(); //ERROR. Class Bar not found
}
}
$foo=new Foo();
$foo->getBar();
Bar.php
<?php
namespace Bla\Bla;
class Bar {}
答案 0 :(得分:1)
您必须使用该类的完整命名空间。试试这个:(未经测试)
$className="Bla\\Bla\\Bar";
如果名称空间为Bla\Bla
。
答案 1 :(得分:1)
$obj1=new Bar();
该语句将起作用,因为您已经在名称空间Bar
中定义了Bla\Bla
。
$obj2=new $fullClassName();
这将起作用,因为您指的是来自全局命名空间的类。
$obj3=new $className();
这不起作用,因为您尝试从字符串中启动类Bar
,其中当前名称空间Bla\Bla
不会添加到类名。
如果在全局命名空间中定义类Bar
,它将起作用。
#Bar.php
<?php
namespace Bla\Bla{
class Bar {}
}
namespace {
class Bar {
public function __construct(){ echo 'Hi from global ns!';}
}
}