为了检查类,你必须指定它与命名空间,完整路径:
namespace Foo;
class Bar
{
}
和
var_dump(class_exists('Bar'), class_exists('\\Foo\\Bar')); //false, true
– 即您必须指定类的完整路径。您在命名空间中定义它,而不是在全局上下文中。
但是,如果您像在样例中一样在命名空间中导入类,则可以通过导入的名称而不使用命名空间来引用它,但这不允许在动态构造中执行此操作,特别是在线字符串表单类名。例如,以下所有操作都将失败:
namespace Foo;
class Bar {
public static function baz() {}
}
use Foo\Bar;
var_dump(class_exists('Bar')); //false
var_dump(method_exists('Bar', 'baz')); //false
$ref = "Bar";
$obj = new $ref(); //fatal
等等。问题在于为导入别名工作的机制。所以当使用这样的结构时,你必须指定完整路径:
var_dump(class_exists('\Foo\Bar')); //true
var_dump(method_exists('\Foo\Bar', 'baz')); //true
$ref = 'Foo\Bar';
$obj = new $ref(); //ok