gpt4 book ai didi

php - 相对命名空间和 call_user_func()

转载 作者:可可西里 更新时间:2023-11-01 13:14:55 29 4
gpt4 key购买 nike

代码胜于 Eloquent :

namespaces.php:

<?php

namespace foo;

use foo\models;

class factory
{
public static function create($name)
{
/*
* Note 1: FQN works!
* return call_user_func("\\foo\\models\\$name::getInstance");
*
* Note 2: direct instantiation of relative namespaces works!
* return models\test::getInstance();
*/

// Dynamic instantiation of relative namespaces fails: class 'models\test' not found
return call_user_func("models\\$name::getInstance");
}
}

namespace foo\models;

class test
{
public static $instance;

public static function getInstance()
{
if (!self::$instance) {
self::$instance = new self;
}

return self::$instance;
}

public function __construct()
{
var_dump($this);
}
}

namespace_test.php:

<?php

require_once 'namespaces.php';

foo\factory::create('test');

如评论所述,如果我在 call_user_func() 中使用完全限定名称,它会按预期工作,但如果我使用相对 namespace ,它会说找不到该类——但直接实例化有效。我是不是遗漏了某些东西或它的设计怪异

最佳答案

您必须在回调中使用完全限定的类名。

参见 Example #3 call_user_func() using namespace name

<?php

namespace Foobar;

class Foo {
static public function test() {
print "Hello world!\n";
}
}

call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0

我相信这是因为 call_user_func 是一个来自全局范围的函数,也从全局范围执行回调。不管怎样,请看第一句。

另见上面的注释 Example #2 Dynamically accessing namespaced elements哪个州

One must use the fully qualified name (class name with namespace prefix).

关于php - 相对命名空间和 call_user_func(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14682356/

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