在PHP中,类如何引用自己的名称?
例如,该方法会是什么样的?
Dog::sayOwnClassName();
//echos "Dog";
Run Code Online (Sandbox Code Playgroud)
我看到每个人都在说get_class($this).但这不正确.如果我创建一个Dog 实例,那将会有效.我问的是调用Dog类本身的方法.如果是Dogextends Mammal,那么get_class($this)对Dog类内部的调用将返回'Mammal'.
换一种说法:
例如:
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
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
Yac*_*oby 25
三个选项,get_called_class(),get_class()或者魔法不变 __CLASS__
其中三个get_called_class()是你在使用静态函数处理时想要的那个,尽管它确实要求PHP版本至少为5.3.0
如果你需要在派生类时在静态函数中获取类self,那么它与放置它的类名解析时会略有不同(参见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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
__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
Run Code Online (Sandbox Code Playgroud)