gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:56:31 25 4
gpt4 key购买 nike

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

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

最佳答案

正如路人所说,答案是 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 命名空间范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com