Наследование классов и констант

GooG2e

Новичок
Суть проста - например у меня есть абстрактный класс:
PHP:
abstract class widget{
	const TAG="WIDGET_NAME";
	function createWidget(){	
	}
	function execWidget(){
		//Бла бла бла
	}

}
При наследовании этого класса константу TAG я переопределяю для каждого нового класса, а метод execWidget() остается старым(т.е. я его не переопределяю).
Возможно ли сделать, чтобы значение константы бралось не из абстрактного класса, а реального?
P.S. Посути вопрос состоит в том можно ли как-то обратится к дочернему элементу?
P.S.S.Не считайте это каким-то идиотизмом - просто живой интерес - возможно или нет?
 

GooG2e

Новичок
Собственно здесь более или менее разобрался-надо при обращении к константе использовать static::
А как быть с обычными переменными? Что вместо $this-> использовать?
 

AmdY

Пью пиво
Команда форума
Переопределять константу нельзя хотеть, даже если бы ты был разработчиком битрикса.
создай метод abstract public function getTag();
я бы ещё сделал кастинг дефолтного значения по названию класса, но это уж как тебе хочется.
 

GooG2e

Новичок
Я не переопределял просто обращался(ну т.е. значение забирал)
С $this-> тоже разобрался просто нужно было перед переменной protected, а не private ставить.
А про кастинг дефолтного значения можешь пояснить? Там можно сделать, чтобы все к верхнему регистру привелось?
 

GooG2e

Новичок
Странно на хостинге не работает static:: подскажите в чем проблема может быть?
 

GooG2e

Новичок
5.3.0 нужна??
просто там стоит 5.2.17
P.S. Как-нить вывернуться без static:: нельзя??
 

Absinthe

жожо
GooG2e сегодня единственная актуальная(поддерживаемая, с багфиксами) версия PHP - это 5.3.
Выворачиваться можно... Только неудобно. 5.3 внес значительные изменения синтаксиса.
 

GooG2e

Новичок
А про кастинг дефолтных значений для констант объяснить можете?? Я просто не совсем понял, что хотя бы искать надо - с помощью данной операции можно будет название класса к верхнему регистру привести и установить для всех наследников класса?
 

AmdY

Пью пиво
Команда форума
можно задачать дефолтное имя прямо в конструкторе
PHP:
    protected $_name = null;
    final public function __construct($data = array()) {
        if (!$this->_name) {
            $class = get_class($this);
            $modelName = preg_replace('~^Model_~', '', $class);
            $this->_name = strtolower($modelName);
        }
     }
соответственно если имя прописано, то будет использоваться оно, иначе высчитывается автоматически.
 

GooG2e

Новичок
А для констант такое можно провернуть разве???
Так то понятно, что в конструкторе можно(ну для обычных переменных)..
 

Redjik

Джедай-мастер
А константа волшебная у тебя чтоли?

Если тебе нужно вдруг поменять константу, то не обьявляй ее, а делай сразу переменной с дефолтными значениями.
 

GooG2e

Новичок
Мне как раз изменять не надо... Нужно один раз установить и все...
Просто меня удивила фраза про установку дефолта для константы - вот и интересно было услышать...
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
без комментариев. это решит вашу проблему? (PHP >=5.3)

PHP:
abstract class Foo {    const TAG = 'Foo'; }

class One extends Foo {    const TAG = 'One'; }

class Two extends Foo {    const TAG = 'Two'; }

$c = new Two;

echo $c::TAG;
 
  • Like
Реакции: A1x

GooG2e

Новичок
Такой вариант сейчас я и использую примерно..
Мне интересно можно ли эту константу определить примерно таким способом(причем через наследование)
const TAG=strtoupper(get_class());
P.S.Это честно говоря не проблема, а скорее живой интерес)
 

Sufir

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

AmdY

Пью пиво
Команда форума
Константа в пределах всей цепочки должна оставаться константой, а не переопределяться в наследниках. Мне вообще кажется, что в таких моментах php должен был бы генерить ошибку.
 
Сверху