PHP:一个类如何引用自己的名字?

Nat*_*ong 9 php

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

例如,该方法会是什么样的?

Dog::sayOwnClassName();
//echos "Dog";
Run Code Online (Sandbox Code Playgroud)

更新

我看到每个人都在说get_class($this).但这不正确.如果我创建一个Dog 实例,那将会有效.我问的是调用Dog类本身的方法.如果是Dogextends Mammal,那么get_class($this)Dog类内部的调用将返回'Mammal'.

换一种说法:

  • 我不是在问"Dog class的类是什么",答案是"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)

更新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     
    }
Run Code Online (Sandbox Code Playgroud)

Yac*_*oby 25

三个选项,get_called_class(),get_class()或者魔法不变 __CLASS__

其中三个get_called_class()是你在使用静态函数处理时想要的那个,尽管它确实要求PHP版本至少为5.3.0


get_called_class()

如果你需要在派生类时在静态函数中获取类self,那么它与放置它的类名解析时会略有不同(参见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
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)