PHP:类如何引用自己的名称?

PHP:类如何引用自己的名称?,php,Php,在PHP中,类如何引用自己的名称 例如,该方法看起来是什么样的 Dog::sayOwnClassName(); //echos "Dog"; 更新 我看到每个人都在说get\u class($this)。但这是不对的。如果我创建一个狗的实例,那就行了。我问的是如何调用Dog类本身的一个方法。如果Dog扩展了emdamal,那么在Dog类中调用get\u class($this)将返回'emdamal' 换言之: 我不是问“狗的阶级是什么”,答案是,“狗的阶级是哺乳动物阶级的一员。” 我也不是

在PHP中,类如何引用自己的名称

例如,该方法看起来是什么样的

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