В PHP, как класс может ссылаться на свое собственное имя?
Например, как бы выглядел этот метод?
Dog::sayOwnClassName(); //echos "Dog";
Я вижу, что все говорят get_class($this)
. Но это неправильно. Это будет работать, если я создам экземпляр Dog. Я прошу о вызове метода самого класса Dog. Если Dog
расширяет Mammal
, тогда вызов get_class($this)
внутри класса 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 }
Предложение 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()
или магическая константа __CLASS__
Из этих трех get_called_class()
это тот, который вы хотите, когда используете статическую функцию, хотя, к сожалению, у него есть требование для PHP-версии не менее 5.3.0
Если вам нужно получить класс в статической функции, когда класс может быть выведен, он немного отличается, поскольку self
разрешен к имени класса, где он был помещен (см. Ограничения self ::) . Чтобы обойти эту проблему, вам нужно использовать функцию из PHP 5.3.0 get_called_class()
.
Если вы не можете использовать PHP 5.3.0 или выше, вы можете обнаружить, что вы не можете сделать статическую функцию и до сих пор добиваться желаемых результатов.
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 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
echo get_class($this);
Ну, get_class ($ Object)
Тогда в классе используется __CLASS__
Или вы можете сделать метод, который будет возвращать __CLASS__
используйте магическую константу __CLASS__
public function sayClassName() { echo get_class($this); }
get_class () php docs