为了检查类,你必须指定它与命名空间,完整路径:
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
本文讨论了在PHP中如何正确引用命名空间内的类,强调了使用完全限定名(FQCN)的重要性。当尝试通过变量或动态字符串创建类实例时,必须使用FQCN,因为导入的别名不适用于动态构造。示例展示了不使用FQCN导致的错误情况,如`class_exists`和`method_exists`返回false,以及尝试实例化类时的致命错误。
185

被折叠的 条评论
为什么被折叠?



