在PHP中,类如何引用自己的名称?
例如,该方法会是什么样的呢?
Dog::sayOwnClassName();
//echos "Dog";
我看到每个人都在说get_class($this)
。但这不正确。如果我正在创建一个狗的实例,那将会有效。我问的是调用Dog类本身的方法。如果Dog
延长Mammal
,则get_class($this)
课程内对Dog
的调用将返回'哺乳动物'。
换句话说:
例如:
class Mammal {
public function find_by_id($id){
$query = "SELECT * FROM " . $myclass . " WHERE `id` = " . $id;
//(etc)
return $matching_object;
}
}
class Dog extends Mammal {
//find_by_id method should know to do a SELECT from Dog table
}
Yacoby对get_called_class()
的建议是正确的。以下是我给出的示例中的工作原理。
class Mammal {
public function find_by_id($id){
$myclass = get_called_class();
$query = "SELECT * FROM " . $myclass . " WHERE `id` = " . $id;
//(etc)
return $matching_object;
}
}
class Dog extends Mammal {
//find_by_id knows to do a SELECT from Dog table
//and will return the correct dog object
}
答案 0 :(得分:24)
三个选项,get_called_class()
,get_class()
或magic constant __CLASS__
这三个get_called_class()
中有一个是你在使用静态函数处理时想要的那个,尽管它确实要求PHP版本至少为5.3.0
如果你需要在派生类时在静态函数中获取类,则稍微不同,因为self
被解析为放置它的类名(参见Limitations of self::)。要解决此问题,您需要使用PHP 5.3.0 get_called_class()
中的函数。
如果您不能使用PHP 5.3.0或更高版本,您可能会发现无法使该功能保持静态,并且仍能使其达到您想要的效果。
get_class()
返回对象所在的实际类的名称,而不管函数调用的位置。
class Animal{
public function sayOwnClassName(){
echo get_class($this);
}
}
class Dog extends Animal{
}
$d = new Dog();
$d->sayOwnClassName(); //echos Dog
$a = new Animal();
$a->sayOwnClassName(); //echos Animal
get_class
也可以在没有参数的情况下使用,乍一看似乎表明它会使用静态函数(因为不需要传递$this
),但是在没有参数的情况下使用时它的工作方式与__CLASS__
class Animal{
public static function sayOwnClassName(){
echo get_class();
}
}
class Dog extends Animal{
}
Dog::sayOwnClassName(); //echos Animal
Animal::sayOwnClassName(); //echos Animal
__CLASS__
始终扩展为已解析__CLASS__
的类的名称,即使考虑了继承也是如此。
class Animal{
public function sayOwnClassName(){
echo __CLASS__; //will always expand to Animal
}
}
class Dog extends Animal{
}
$d = new Dog();
$d->sayOwnClassName(); //echos Animal
$a = new Animal();
$a->sayOwnClassName(); //echos Animal
答案 1 :(得分:2)
echo get_class($this);
答案 2 :(得分:1)
嗯,有get_class($ Object)
然后在类
中使用__CLASS__或者您可以创建一个返回__CLASS __
的方法答案 3 :(得分:1)
使用魔法常量__CLASS__
答案 4 :(得分:0)
public function sayClassName()
{
echo get_class($this);
}