在PHP中,类如何引用自己的名称?
例如,该方法将如何执行此操作?
Dog::sayOwnClassName();
//echos "Dog";
更新
我看到每个人都在说
get_class($this)
。但这是不正确的。如果我创建Dog的实例,那将起作用。我在问有关调用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
}
更新2
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
}
最佳答案
三个选项 get_called_class()
, get_class()
或magic constant __CLASS__
在这三种 get_called_class()
中,您需要使用静态函数进行处理,尽管不幸的是,它确实要求PHP版本至少为5.3.0。
get_drawn_class()
如果在派生类时需要在静态函数中获取该类,则将self
解析为放置该类的类名(请参阅Limitations of self::),这会有所不同。要变通解决此问题,您需要使用PHP 5.3.0 get_called_class()
中的函数。
如果您不能使用PHP 5.3.0或更高版本,您可能会发现无法使该函数静态化,而仍然可以达到所需的结果。
get_class()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__
的类的名称,即使考虑到继承也是如此。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
关于PHP:类如何引用其自己的名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2594093/