Intereting Posts

PHP: как класс может ссылаться на свое собственное имя?

В PHP, как класс может ссылаться на свое собственное имя?

Например, как бы выглядел этот метод?

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

Обновить

Я вижу, что все говорят get_class($this) . Но это неправильно. Это будет работать, если я создам экземпляр Dog. Я прошу о вызове метода самого класса Dog. Если Dog расширяет Mammal , тогда вызов get_class($this) внутри класса Dog вернет «Mammal».

Другими словами:

  • Я не спрашиваю: «Каков класс класса« Собака », на который отвечает:« Класс собаки является членом класса млекопитающих ».
  • Я также не прошу «дать экземпляр Dog Dog class (называемый Rover), каков его класс?», На который отвечает «Собака».
  • Я спрашиваю: «Может ли сам класс собак сказать мне, что меня зовут« Собака »?»

Например:

 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 } 

Solutions Collecting From Web of "PHP: как класс может ссылаться на свое собственное имя?"

Три варианта: 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 

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