#php #oop #class
#php #ооп #класс
Вопрос:
У меня есть несколько классов, расширенных таким образом:
class Baseresidence extends CActiveRecord {
public static function model($className=__CLASS__) {
return parent::model($className); // framework needs, can't modify
}
}
class Site1Residence extends Baseresidence {
}
и, наконец
class_alias('Site1Residence', 'Residence'); // this is part of an autoloader
Итак, в итоге у меня получается вот так Residence extends Site1Residence extends Baseresidence extends CActiveRecord
В базовом идентификаторе у меня есть статический метод model()
, который извлекает экземпляр.
Теперь я могу вызвать::
$r=Residence::model();
Проблема в том, что __CLASS__
в качестве значения по умолчанию используется константа, и на этом уровне это базовое значение, и мне нужно там имя класса верхнего уровня (созданное с помощью псевдонима), и оно должно быть ‘Residence’
если я сделаю:
echo get_class($r); // the Baseresidence is printed
Цель состоит в том, чтобы напечатать residence
Я не хочу ничего передавать при вызове $r=Residence::model();
Я хотел бы разрешить это в корнях.
Как получить имя класса верхнего уровня на этом уровне?
Комментарии:
1. Константа
__CLASS__
, используемая в классе,Baseresidence
всегда будет содержатьBaseresidence
. Вы не можете это изменить.
Ответ №1:
Попробуйте
get_called_class();
Смотрите http://php.net/manual/en/function.get-called-class.php
Из документации:
class foo {
static public function test() {
var_dump(get_called_class());
}
}
class bar extends foo {
}
foo::test();
bar::test();
Приведенный выше пример выведет:
string(3) "foo"
string(3) "bar"
Комментарии:
1. Правильный ответ, но я заметил один комментарий:
// framework needs, can't modify
— если он не может изменить эту строку… Я не уверен, что он сможет использовать это решение.2. Я могу изменить
$className
переменную раньше. Это хорошее решение, иget_called_class
для PHP 5.2.4 тоже есть решение. php.net/manual/en/function.get-called-class.php3. @OZ_, то, как я прочитал эту строку, заключается в том, что фреймворку требуется имя класса. Передача имени класса верхнего уровня не должна иметь негативного эффекта.
4. @Pentium10, посмотри в комментариях к этой странице документа, есть альтернативы этой функции для PHP 5.2
5. Также вы можете использовать
static::class
вместо