在PHP中作为非字符串参数的类

时间:2013-01-11 13:31:58

标签: php class static

文件1中的示例:

namespace A;

class Foo{

}

文件2:

use A\Foo;

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

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

有没有办法可以在常量等函数参数中传递类名,所以我不需要预先添加名称空间?

4 个答案:

答案 0 :(得分: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');

除了{/ 1}}语句中的(并且这是唯一的例外),因为只能出现完整的命名空间标识符,所以为方便起见,可以在那里省略它。

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

答案 1 :(得分: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");

答案 2 :(得分:1)

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

use A\Foo;

$foo = new Foo();

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

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

答案 3 :(得分:1)

或者你可以通过课堂反思。

ReflectionClass