Перегрузка констант класса или self...

newARTix

Новичок
Перегрузка констант класса или self...

Вопрос наверное риторический, но меня довольно сильно удивило то что выводит этот код:

PHP:
<?php

class ParentObject {
	
	const something = false;
	
	function showSomethingAtParent() {
		echo self::something?'Правда':'Ложь';
		echo '<br />';
	}

}

class ChildObject extends ParentObject {
	
	const something = true;
		
	function showSomething() {
		echo self::something?'Правда':'Ложь';
		echo '<br />';
	}
}

$object = new ChildObject();
$object->showSomething();
$object->showSomethingAtParent();

?>
А как мне получить к примеру ChildObject::something внутри не перегруженных методов ParentObject? Если последний ничего не знает о своих наследниках...
 

newARTix

Новичок
StUV
а как получить свойство объекта которое невозможно будет изменить в процессе работы объекта, но оно может быть перегружено объектами наследниками? Это невозможно?

Получается, что классы для констант это всего-лишь пространство имен и ничего более.
А как насчет константных свойств объектов? Это нереализуемо?
 

dimagolov

Новичок
newARTix, подозреваю, что ты константы и наследование хочешь использовать не по назначению. То есть константами переопределять поведение методов предка, что в корне не верно. Методы предка должны делать что умеют, а все переопределение поведения происходить в перегруженных методах наследников
 

StUV

Rotaredom
А как насчет константных свойств объектов? Это нереализуемо?
можно что-то вроде
PHP:
class Parent
{
protected $some;
protected getSome() {return false;}
protected setSome() {}
}

class Child extends Parent
{
protected getSome {return $this->some;}
protected setSome($some) {$this->some = $some}
}
-~{}~ 23.01.09 16:27:

т.е. парент только объявляет свойство для чайлдов, но сам использует некоторое константное значение (можно его задать в конструкторе в другой, private переменной);
а действительно менять его могут только чайлды

---
но, что-то тут с проектированием не так... - м.б. лучше расскажешь какая задача привела тебя к необходимости таких конструкций ?
 

newARTix

Новичок
dimagolov, StUV, спасибо что наставили на путь истинный :) Это действительно ошибка в проектировании.


StUV
Задача...
Например, сделать переменную содержащую путь к директории для хранения файлов. И работают с ней как родительские так и перегруженные методы. С одной стороны она может отличаться у наследника, с другой стороны я хочу избежать соблазна ее изменения в процессе работы объекта самим объектом.

Впрочем, как я уже сказал, это действительно похоже на бред, пойду курить бамбук :)
 

dimagolov

Новичок
newARTix, путь для хранения это вообще сильно на конфигурационные данные смахивает и не должны быть зашиты в коде, а вообще должны получаться снаружи от соответствующего хранилища
 

newARTix

Новичок
dimagolov
неудачный пример, ну допустим... любое другое свойство объекта, как там говорят теоретики…

класс Корабль (железный, тяжелый, плавает, на солярке)
метод Заправить (если топливо = солярка, разрешить)

класс Атомный ледокол (все наследует, но на уране)
метод Заправить (если топливо = уран, разрешить)

В данном случае я перегрузил метод Заправить чтобы он проверял топливо по новому, ну а если этот метод очень сложный и касается кучи других вопросов (заплатить бабло за топливо, измерить текущий уровень и т.п.) мне что переписывать его полностью в наследнике только из-за одной константы?

Впрочем, повторюсь, я признаю что проблема надумана :)
 

dimagolov

Новичок
вот тип топлива должен прописываться в потомках и должны быть Атомоходы, Теплоходы и Пароходы наследниками от Корабля.

А заправка может быть унифицированной, в предке, но обращаться к абстрактному методу "проверить топливо" которые бы определялись в наследниках
 

StUV

Rotaredom
Впрочем, повторюсь, я признаю что проблема надумана
в данном случае могу только посоветовать почитать что-нибудь по оо-проектированию
т.к. проблема хоть и надумана, но часто встречается и решение давно стандартизировано в уже "классической" литературе
 
Сверху