За последние 24 часа нас посетили 16919 программистов и 1292 робота. Сейчас ищут 1414 программистов ...

Константы в классах (PHP 5.2)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Argentum, 15 май 2012.

  1. Argentum

    Argentum Активный пользователь

    С нами с:
    31 окт 2007
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Москва
    Привет тебе, несокрушимый All!

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

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

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

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

    И вот тут в PHP 5.2.x мы наступаем на развесистые грабли. Он напрочь не понимает синтаксис вида:
    Код (Text):
    1. $class_name::some_const
    или
    Код (Text):
    1. $class_name::$some_static_var
    Попытки выкрутиться с помощью статических же методов наталкиваются на дополнительные грабли в виде отсутствия т.н. "позднего статического связывания" (короче, метод берёт то значение константы, которое определено в предке, а не в данном классе).

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

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

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.112
    Симпатии:
    1.243
    Адрес:
    там-сям
    Нормального решения не знаю, можно наверное рефлексию использовать, только тяжеловесно всё это. Я бы при таких раскладах или решил забить на совместимость с 5.2 или подумал как изменить формулировку задачи чтобы не требовалось обращаться к $class_name.
     
  3. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.112
    Симпатии:
    1.243
    Адрес:
    там-сям
    топикстартер спрашивал о константах либо переменных, а не о методах
     
  5. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Если надо решить именно данную задачу (каким-то образом узнать ид класса), то 4 строчки метода вместо 1 строчки константы - не сильно страшно.

    Хотя по-моему магия в коде вроде запрашиваемой - это плохо.