Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Константы в классах
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Константы в классах

Страниц (1): [1]
 

1. Abyrvalg - 14 Мая, 2012 - 23:36:23 - перейти к сообщению
Привет тебе, несокрушимый All!

Возникла проблема, на которой я с ходу затупил.
Предположим, есть некий абстрактный класс, у которого существует несколько конкретных классов-реализаций. Предположим также, что абстрактный класс имеет некое свойство, которое наследуется потомками. Это свойство уникально для каждого класса. Ну, например, объявляем абстрактный класс AbstractClass с неким свойством UserType, по умолчанию равным нулю (значения это не имеет, класс-то абстрактный), а дальше объявляем классы ConcreteClass1 и ConcreteClass2. У первого свойство UserType будет равно 1, а у второго - 2.
Казалось бы, проблем тут никаких нет. Можно объявить это свойство как публичную переменную. Можно - как приватную, со специально приделанным методом типа getUserType(). А можно вовсе константу, которая будет иметь своё значение для каждого класса. Это представляется наиболее логичным.

Но есть два условия, которые портят всю малину.

1) К свойству UserType надо обращаться без привязки к созданию соответствующего объекта.
То есть, UserType должен быть константой класса или, по крайней мере, статическим членом класса.

2) Заранее не известно, какая именно реализация абстрактного предка будет использоваться.
То есть, имя предназначенного для использования конкретного класса будет, к примеру, сидеть в какой-нибудь переменной.

И вот тут в PHP 5.2.x мы наступаем на развесистые грабли. Он напрочь не понимает синтаксис вида:

или


Попытки выкрутиться с помощью статических же методов наталкиваются на дополнительные грабли в виде отсутствия т.н. "позднего статического связывания" (короче, метод берёт то значение константы, которое определено в предке, а не в данном классе).

В общем, в PHP 5.3 все эти проблемы решены, всё в шоколаде. Но по ряду вполне обыденных причин (привязка к конкретному хостингу и невозможность изменить на нём софт) я вынужден работать с 5.2.

Что присоветуете? Наверняка ведь где-то есть простой и доступный способ обойти грабли, а я протупил...

 

Powered by ExBB FM 1.0 RC1