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

例如,该方法将如何执行此操作?

Dog::sayOwnClassName();
//echos "Dog";

更新

我看到每个人都在说get_class($this)。但这是不正确的。如果我创建Dog的实例,那将起作用。我在问有关调用Dog类本身的方法的问题。如果Dog扩展了Mammal,则对get_class($this)类内的Dog的调用将返回“哺乳动物”。

换句话说:
  • 我不是在问“狗类是什么类”,答案是“狗类是哺乳动物类的成员”。
  • 我也没有问“给定Dog类的实例(称为流浪者),它的类别是什么?”,答案是“Dog”。
  • 我要问的是,“Dog类本身可以告诉我'我的名字是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/

  • 10-11 03:04
    查看更多