子类的方法的PHP命名空间范围?

时间:2012-09-13 05:14:12

标签: php namespaces

我遇到了不同命名空间中父/子类的问题,我想知道这是不正当使用,还是这是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类不会覆盖该工厂方法;它只是继承它。但是,当按名称引用类对象时,它似乎仍然在父级的命名空间中运行,而不是让该方法真正被子级继承并在子级命名空间中操作。

是否有一种方法可以直接继承父类方法以使用子命名空间,或者至少查看它是什么?或者我的每个子类都必须覆盖工厂方法来修复命名空间,并在自己内部调用父方法?

1 个答案:

答案 0 :(得分:1)

正如Passerby所说,答案是PHP确实有一个__NAMESPACE__常量,该常量填充了当前的命名空间(尽管没有前导斜杠)。因此将工厂功能修改为:

function factory($class) {
  if ($class[0] != '\\') {
    $class = '\\'.__NAMESPACE__.$class; // If not a fully-qualified classname, prepend namespace
  }
  return new $class($args);
}

按预期工作(PHP文档中有an example

相关问题