为了检查类,你必须用命名空间,完整路径指定它:
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