PHP:类如何引用自己的名称?
在PHP中,类如何引用自己的名称 例如,该方法看起来是什么样的PHP:类如何引用自己的名称?,php,Php,在PHP中,类如何引用自己的名称 例如,该方法看起来是什么样的 Dog::sayOwnClassName(); //echos "Dog"; 更新 我看到每个人都在说get\u class($this)。但这是不对的。如果我创建一个狗的实例,那就行了。我问的是如何调用Dog类本身的一个方法。如果Dog扩展了emdamal,那么在Dog类中调用get\u class($this)将返回'emdamal' 换言之: 我不是问“狗的阶级是什么”,答案是,“狗的阶级是哺乳动物阶级的一员。” 我也不是
Dog::sayOwnClassName();
//echos "Dog";
更新
我看到每个人都在说get\u class($this)
。但这是不对的。如果我创建一个狗的实例,那就行了。我问的是如何调用Dog类本身的一个方法。如果Dog
扩展了emdamal
,那么在Dog
类中调用get\u class($this)
将返回'emdamal'
换言之:
- 我不是问“狗的阶级是什么”,答案是,“狗的阶级是哺乳动物阶级的一员。”
- 我也不是问“给定一个Dog-the-Dog类(称为Rover)的实例,它的类是什么?”答案是“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\u called\u 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
}
三个选项,或\uuuuuuuuu类
class Animal{
public static function sayOwnClassName(){
echo get_class();
}
}
class Dog extends Animal{
}
Dog::sayOwnClassName(); //echos Animal
Animal::sayOwnClassName(); //echos Animal
在使用静态函数处理时,这三个函数中有一个是您想要的,尽管不幸的是,它确实需要至少5.3.0版本的PHP
获取名为_的类() 如果在派生类时需要在静态函数中获取该类,则会略有不同,因为
self
解析为放置该类的类名(请参阅)。要解决这个问题,您需要使用PHP5.3.0中的函数
如果您不能使用PHP5.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\u class
也可以在没有参数的情况下使用,乍一看,这似乎表明它将使用静态函数(因为不需要传递$this
),但是在没有参数的情况下使用时,它的工作方式与\uu class
相同
class Animal{
public static function sayOwnClassName(){
echo get_class();
}
}
class Dog extends Animal{
}
Dog::sayOwnClassName(); //echos Animal
Animal::sayOwnClassName(); //echos Animal
__阶级__
\uuuu CLASS\uuuu
始终扩展到解析了\uuuu CLASS\uuuu
的类的名称,即使在考虑继承的情况下也是如此
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
嗯,有一个get_类($Object) 当在类中使用时,还有类
或者,您可以创建一个返回uuu CLASS uu的方法,除了获取u CLASS和更好的示例Acoby之外,还可以使用魔法常量\uuuuu CLASS+1来提及魔法常量-您正在实例化Dog。“我没有。”内森,我错过了这个复杂的过程,我道歉。我在回答的底部添加了更多的信息。@Yacoby-太好了!谢谢-这就成功了。您是否介意编辑您的答案,只显示get_called_class()部分,以便稍后找到它的人可以直接找到它?@Nathan Done(不是很好,但is更清楚地显示了get_called_class部分)我不是实例化Dog-我使用的是类级方法。
class Animal{
public static function sayOwnClassName(){
echo get_class();
}
}
class Dog extends Animal{
}
Dog::sayOwnClassName(); //echos Animal
Animal::sayOwnClassName(); //echos Animal