如何从扩展PHP类中的静态调用中获得类名?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我有两个类:ActionMyAction。后者被声明为:

class MyAction extends Action {/* some methods here */}

我所需要的只是在Action类中的方法(仅在它中,因为会有很多继承类,而且我不想在它们中实现这个方法),它将从静态调用中返回classname。以下是我正在谈论的内容:

Class Action {
 function n(){/* something */}
}

当我把它:

MyAction::n(); // it should return "MyAction"

但是父类中的每个声明都只能访问__CLASS__具有值“Action” 的父类变量。

有没有办法做到这一点?

提问于
用户回答回答于

__CLASS__总是返回所使用的类的名称,所以对静态方法没有多大的帮助。如果方法不是静态的,你可以简单地使用get_class($ this)。例如

class Action {
    public function n(){
        echo get_class($this);
    }

}

class MyAction extends Action {

}

$foo=new MyAction;

$foo->n(); //displays 'MyAction'

现在PHP 5.3已经发布了,它提供了一个新的函数get_called_class(),它可以告诉你一个静态方法被调用的类的名字。下面是一个例子:

Class Action {
    public static function n() {
        return get_called_class();
    }
}


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction
用户回答回答于

从5.5开始,你可以使用class关键字来进行类名解析,这比进行函数调用要快得多。也适用于接口。

// C extends B extends A

static::class  // MyNamespace\ClassC when run in A
self::class    // MyNamespace\ClassA when run in A
parent::class  // MyNamespace\ClassB when run in C
MyClass::class // MyNamespace\MyClass

扫码关注云+社区

领取腾讯云代金券