我在不同的命名空间中遇到了父/子类的问题,我想知道这是我使用不当,还是这是 PHP 命名空间的怪癖:
<?php
namespace myVendorName;
class MyParentClass {
protected $args = array();
function factory($class) {
return new $class($this->args);
}
}
?>
<?php
namespace myVendorName\subPackage;
class foo {
}
class bar extends \myVendorName\MyParentClass {
function myFunc() {
var_dump(new foo()); // Works (we're in the same namespace)
var_dump($this->factory('foo')); // Doesn't work (no such class as myVendorName\foo)
var_dump($this->factory('subPackage\foo')); // Works
}
}
?>
上面的代码不像我预期的那样工作。在\myVendorName\subPackage\bar->myFunc()
方法中,我想\myVendorName\subPackage\foo
上课。如果我只是在那里创建它,我可以只通过它的类名来创建它,因为命名空间是相同的。然而,这些类实际上更复杂,并且有一个工厂方法来创建它们。工厂方法是通用的,并且在根供应商命名空间中定义。并且bar
该类不会覆盖该工厂方法;它只是继承它。但是,当通过名称引用类对象时,它似乎仍然在父命名空间中运行,而不是让该方法真正由子继承并在子命名空间中运行。
有没有办法让直接继承的父类方法使用孩子的命名空间,或者至少看看它是什么?还是我的每个子类都必须覆盖工厂方法来修复命名空间,并在自己内部调用父方法?