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

Posted

技术标签:

【中文标题】子类方法的PHP命名空间范围?【英文标题】:PHP namespace scope for a child class' method? 【发布时间】:2012-09-13 05:14:12 【问题描述】:

我在不同的命名空间中遇到了父/子类的问题,我想知道这是我使用不当,还是这是 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-&gt;myFunc() 方法中,我想获得一个\myVendorName\subPackage\foo 类。如果我只是在那里创建它,我可以只通过它的类名来创建它,因为命名空间是相同的。然而,这些类实际上更复杂,并且有一个工厂方法来创建它们。工厂方法是通用的,并且在根供应商命名空间中定义。 bar 类不会覆盖该工厂方法;它只是继承它。但是,当通过名称引用类对象时,它似乎仍然在父命名空间中运行,而不是让方法真正被子继承并在子命名空间中运行。

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

【问题讨论】:

PHP 文档中有一个comment,您可能想查看... 【参考方案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)

【讨论】:

以上是关于子类方法的PHP命名空间范围?的主要内容,如果未能解决你的问题,请参考以下文章

PHP的 Final关键字类(文件)的加载和命名空间

从 PHP 中的超类获取子类命名空间

php命名空间

PHP SimpleXML->addChild - 不需要的空命名空间属性

空操作命名空间

PHP中的命名空间