Привет тебе, несокрушимый All! Возникла проблема, на которой я с ходу затупил. Предположим, есть некий абстрактный класс, у которого существует несколько конкретных классов-реализаций. Предположим также, что абстрактный класс имеет некое свойство, которое наследуется потомками. Это свойство уникально для каждого класса. Ну, например, объявляем абстрактный класс AbstractClass с неким свойством UserType, по умолчанию равным нулю (значения это не имеет, класс-то абстрактный), а дальше объявляем классы ConcreteClass1 и ConcreteClass2. У первого свойство UserType будет равно 1, а у второго - 2. Казалось бы, проблем тут никаких нет. Можно объявить это свойство как публичную переменную. Можно - как приватную, со специально приделанным методом типа getUserType(). А можно вовсе константу, которая будет иметь своё значение для каждого класса. Это представляется наиболее логичным. Но есть два условия, которые портят всю малину. 1) К свойству UserType надо обращаться без привязки к созданию соответствующего объекта. То есть, UserType должен быть константой класса или, по крайней мере, статическим членом класса. 2) Заранее не известно, какая именно реализация абстрактного предка будет использоваться. То есть, имя предназначенного для использования конкретного класса будет, к примеру, сидеть в какой-нибудь переменной. И вот тут в PHP 5.2.x мы наступаем на развесистые грабли. Он напрочь не понимает синтаксис вида: Код (Text): $class_name::some_const или Код (Text): $class_name::$some_static_var Попытки выкрутиться с помощью статических же методов наталкиваются на дополнительные грабли в виде отсутствия т.н. "позднего статического связывания" (короче, метод берёт то значение константы, которое определено в предке, а не в данном классе). В общем, в PHP 5.3 все эти проблемы решены, всё в шоколаде. Но по ряду вполне обыденных причин (привязка к конкретному хостингу и невозможность изменить на нём софт) я вынужден работать с 5.2. Что присоветуете? Наверняка ведь где-то есть простой и доступный способ обойти грабли, а я протупил...
Нормального решения не знаю, можно наверное рефлексию использовать, только тяжеловесно всё это. Я бы при таких раскладах или решил забить на совместимость с 5.2 или подумал как изменить формулировку задачи чтобы не требовалось обращаться к $class_name.
Если надо решить именно данную задачу (каким-то образом узнать ид класса), то 4 строчки метода вместо 1 строчки константы - не сильно страшно. Хотя по-моему магия в коде вроде запрашиваемой - это плохо.