创建一个PHP对象,其中classname是一个变量

时间:2017-03-12 20:00:51

标签: php namespaces composer-php

为什么我在没有使用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 {}

2 个答案:

答案 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!';}
    }
  }