0

文件 1 中的示例:

namespace A;

class Foo{

}

文件 2:

use A\Foo;

do_stuff('A\Foo');  // <- need namespace here :(

Foo::someStaticMethod();  // <- namespace not required :D

有什么方法可以在函数参数中传递类名,比如常量或其他东西,所以我不需要在命名空间前面加上?

4

4 回答 4

2

更新 :)

当我知道时,我需要将某些类的类名作为字符串传递,我用于创建特殊的类常量

namespace Foo\Bar;
class A {
    const __NAMESPACE = __NAMESPACE__;
    const __CLASS = __CLASS__;
}

现在您可以引用类名,例如

use Foo\Bar\A as Baz;
echo Baz::__CLASS;

使用 PHP5.5,这将是内置的

echo Baz::class;

命名空间的完全限定名称 (FQN) 始终以命名空间分隔符开头

do_stuff('\A\Foo');

除了- 语句中的(这是唯一的例外)use,因为只能出现完整的名称空间标识符,因此为方便起见,您可以在此处省略它。

但是,字符串是一个字符串,您将它用作类名的地方超出了解释器的范围,因此它失去了对前use A\Foo一个别名的引用。使用 PHP5.5 你可以编写Foo::class,但我认为现在不是一个选项;)

于 2013-01-11T13:34:04.683 回答
1

不,据我所知,不是没有追踪来电者。您正在调用的函数必须与您尝试传递的对象存在于同一命名空间中。

debug_backtrace如果您需要命名空间解析,您可能想查看该函数。但这需要将文件路径转换为名称空间解析或类似内容。

然而这是可能的:(我看到安德鲁用相同类型的解决方案回答了。)

function doStuff ($obj)
{
    $name = (is_object($obj))
        ? (new ReflectionClass(get_class($obj)))->getName()
        : $obj;

    // $name will now contain the fully qualified name
}


namespace Common;

class Test
{}

$testObj = new Test();

// This will work, but requires argument to be
// fully quialified or an instance of the object.
\doStuff($testObj);
\doStuff("\Common\Test");
于 2013-01-11T13:35:52.163 回答
1

您可以实例化一个新对象,然后调用 get_class() 来获取该类的完全限定名称。

use A\Foo;

$foo = new Foo();

do_stuff(get_class($foo));  // get_class($foo) = '\A\Foo'

这意味着 Foo 的命名空间use语句定义(即更少的代码维护)。

于 2013-01-11T13:51:49.657 回答
1

或者你可以通过类反射。

反射类

于 2013-01-11T14:36:42.137 回答