@Muramidaza

Как в PHP использовать в родителе константу или статическую переменную из потомка?

Мне нужно использовать в родителе константу или статическую переменную из потомка, как правильно это сделать?
  • Вопрос задан
  • 127 просмотров
Решения вопроса 2
@Vitsliputsli
Если вопрос как правильно - то никак, а вредные советы уже предложили. Вы не должны обращаться из родителя к внутренностям потомков, это нарушает весь смысл наследования и создает циклически зависимые классы. Если вам нужно, чтобы какой-то объект управлял другими объектами - то наследование тут не нужно, управляющий и управляемые не родственные объекты (а если даже и родственные, то управление все равно никак не связано с родственными связями). А если нужно чтобы обобщенный метод родителя работал с данными или методами потомка - есть позднее статическое связывание.
Ответ написан
Комментировать
@rPman
Имя_класса::имя_пременной
Так же ключевое слово parent - имя предка, self - текущего класса
например parent::CONST_NAME
p.s. опс, не то.


Чтобы уж ответить на вопрос, в php нет метода получения списка потомков класса, но есть функция get_declared_classes() - возвращает массив имен всех классов, и функция is_subclass_of("объект или имя класса","имя проверяемого класса") вернет true если первый класс является потомком второго. Так всех перебрав можно будет получить список потомков, ну а затем нужному по имени из переменной - $var_class_name::static_member и даже по имени мембера в переменной $var_class_name::$$static_member_name
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
По-хорошему, вам нужно вынести константу (или статическую переменную) в родительский класс, если она используется и в родительском и дочернем классе.

Но, если вам очень нужно, то можете обратиться к константе через имя класса:
class ParentClass {
	public function printTest() {
		print(ChildClass::MY_CONST);
	}
}

class ChildClass extends ParentClass {
	const MY_CONST = 'test';
}

(new ParentClass())->printTest(); // Выведет 'test'

Аналогично для статической переменной:
class ParentClass {
	public function printTest() {
		print(ChildClass::$var);
	}
}

class ChildClass extends ParentClass {
	protected static $var = 'test';
}

(new ParentClass())->printTest(); // Выведет 'test'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы