在PHP中获取类名而不必拥有该类的实例

3

我正在寻找以下 PHP 函数:

class foo
{
}

echo get_class_special(foo);  // returns the string 'foo'

PHP有没有一个函数可以在不创建类的实例的情况下获取类的名称?


3
你会从哪里获取类名?我的意思是,你传递了 foo 并期望得到 foo 返回值,如果类名是 bar,你会放入 bar 并得到 bar 返回值... - CodeCaster
2
如果您没有对象的实例,就无法将该对象传递给任何东西。这意味着您已经必须知道类名,以便实例化它,这反过来使您的函数变得多余... - Repox
1
你不是必须要知道类的名称才能运行函数吗?对不起,也许我漏了什么,但我真的看不出这样做有任何实际用途。 - GordonM
1
可能是PHP:从扩展类的静态调用中获取类名的重复问题。 - Merlyn Morgan-Graham
1
@Repos:foo和'foo'的区别在于解释器知道我使用foo时的意思,但不知道我使用'foo'时的意思。如果foo中有打字错误,它会通知我,而'foo'则不会。因此,如果可能的话,我更喜欢写foo而不是'foo'。现在我正在使用“get_class(new foo())”。但我希望能够找到一种不需要使用new的方法。 - user1027167
显示剩余13条评论
5个回答

5
<?php

class Foo {
    const NAME = __CLASS__;
    // or
    public static $NAME = __CLASS__;
    // or
    public static function getName() {
        return __CLASS__;
    }
}

Foo::NAME; // Foo
// or
Foo::$NAME; // Foo
// or
Foo::getName(); // Foo

?>

2
如果类Bar继承自Foo,这段代码将无法正常工作。Bar::NAME将返回“Foo”。PHP 5.5引入了::class常量来解决这个问题。例如:Bar::class - Serhii Smirnov

3
我感觉有些人对于PHP中的动态类型存在一些困惑:在PHP中不存在class类型的对象,类是通过它们的名称来表示的。因此,如果你在应用程序中写了foo,你会得到一个警告,并且foo将被解释为字符串'foo' - 即使有一个同名的类。
所以,如果你需要调用一个存在于变量中的类的静态函数,你可以这样做:
$class = 'Foo';
$class::staticFuntion(); // will call Foo::staticFunction()

这甚至更进一步,你可以使用变量引用变量:

$className = 'Foo';
$ref = 'className';
$$ref::staticFunction(); // will call Foo::staticFunction()

1

0
为什么不创建静态函数,例如:
class foo {

    public static function myClass() {
         return get_class($this);
    }
}

在你的代码中,你可以使用

foo::myClass();  //return string 'foo'

但是在这里,您需要知道类的名称才能调用它,因此有些多余。如果例如您想要获取类的属性而不实例化它,因为当开发代码时它们可能会发生变化,那么这将是有意义的。


1
这是Merlyn Morgan-Graham在上面提供的链接中描述的方法。不同之处在于,使用'return get_called_class();'代替'return get_class($this);'。我认为在静态函数中不能使用'$this'。 - user1027167

0

我猜没有办法在没有对象的情况下获取类名。但是如果你的实例只声明了一个类,那么你可以使用以下方法来获取它。

get_declared_classes();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接