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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Константы в классах

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Проблема с PHP 5.2
Abyrvalg
Отправлено: 14 Мая, 2012 - 23:36:23
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Привет тебе, несокрушимый All!

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

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

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

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

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

или


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

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

Что присоветуете? Наверняка ведь где-то есть простой и доступный способ обойти грабли, а я протупил...
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB