Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> расширение статических классов 
:(
    Опции темы
bars80080
Дата 2.9.2014, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



есть такой пример:

Код

abstract class prim0 {
    static public $a = 'a';
    static public function re() {
        echo '--'.self::$a.'-<br />';
    }
}
class prim1 extends prim0 {
    static public $a = 'b';
    static public function re() {
        echo '--'.self::$a.'-<br />';
    }
}
class prim2 extends prim0 {
    static public $a = 'c';
    static public function re() {
        echo '--'.self::$a.'-<br />';
    }
}

prim1::$a = 'd';
prim2::$a = 'e';

echo prim0::$a . '<br />';
echo prim1::$a . '<br />';
echo prim2::$a . '<br />';

prim0::re();
prim1::re();
prim2::re();



результат работы:

Код

a
d
e
--a-
--d-
--e-


, но если пишу:

Код

abstract class prim0 {
    static public $a = 'a';
    static public function re() {
        echo '--'.self::$a.'-<br />';
    }
}
class prim1 extends prim0 {
    static public $a = 'b';
}
class prim2 extends prim0 {
    static public $a = 'c';
}

prim1::$a = 'd';
prim2::$a = 'e';

echo prim0::$a . '<br />';
echo prim1::$a . '<br />';
echo prim2::$a . '<br />';

prim0::re();
prim1::re();
prim2::re();



то получаю:

Код

a
d
e
--a-
--a-
--a-


суть в том, что хочу работать со статическими классами, которые унаследуют общий функционал от класса-родителя. но общая функция, получается, опирается на родительские данные, что не есть гуд. можно ли как-то извернуться и отнаследовать функционал для статических классов, не дублируя общий функционал?
PM MAIL WWW   Вверх
s0lman
Дата 2.9.2014, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и лохматый
**


Профиль
Группа: Участник
Сообщений: 637
Регистрация: 1.11.2007
Где: Ukraine

Репутация: 9
Всего: 29



static ?


--------------------
Когда я уже выучусь на волшебника? :(
PM   Вверх
bars80080
Дата 2.9.2014, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(s0lman @  2.9.2014,  17:59 Найти цитируемый пост)
static ? 

ммм, да. даже в заголовке темы я указал, что речь идёт о статических классах
PM MAIL WWW   Вверх
baldina
Дата 2.9.2014, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



вы странного желаете: вне объектного контекста полиморфизм не работает
PM MAIL   Вверх
bars80080
Дата 2.9.2014, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(baldina @  2.9.2014,  22:39 Найти цитируемый пост)
 вне объектного контекста полиморфизм не работает 

жжжаль. а ведь почти получилось. при наследовании от абстрактного класса они получают независимые свойства. почему бы им не получить и независимые методы. может есть какой-нибудь хук?


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

Добавлено через 2 минуты и 23 секунды
вот это http://php.net/manual/en/language.oop5.traits.php
есть материал поразжёванее?

Добавлено через 3 минуты и 44 секунды
правда, мне бы хотелось всё же решить задачу для php5.3
PM MAIL WWW   Вверх
Aliance
Дата 3.9.2014, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Трейты тут не помогут, это что-то между интерфейсом и абстрактным классом. Я бы охарактеризовал их как "интерфейс с конкретной реализацией методов, подключаемых к n-нному количеству классов".

Для реализации же того, что задумано нужно использовать позднее статическое связывание (late static binding). Если заменить в абстрактном методе self::$a на static::$a - получим PROFIT!
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 3.9.2014, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Aliance, в какое место предлагается запихать static, если bars80080 хочет писать так
Цитата

echo prim0::$a . '<br />';
echo prim1::$a . '<br />';
echo prim2::$a . '<br />';

?  smile 
Для статика надо оборачивать свойства в вызов какой то функции...
 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 3.9.2014, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Либо я не правильно понял, либо ТС хочет чтобы методы обращались в свойствам не родителя, а потомков.
Цитата(bars80080 @  3.9.2014,  00:37 Найти цитируемый пост)
а ведь почти получилось. при наследовании от абстрактного класса они получают независимые свойства. почему бы им не получить и независимые методы. может есть какой-нибудь хук?


PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 3.9.2014, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ох, данихренжсебе! получилось

Код

abstract class prim0 {
    static public $a = 'a';
    static public function re() {
        echo '--'.static::$a.'-<br />';
    }
}
class prim1 extends prim0 {
    static public $a = 'b';
}
class prim2 extends prim0 {
    static public $a = 'c';
}

prim1::$a = 'd';
prim2::$a = 'e';

echo prim0::$a . '<br />';
echo prim1::$a . '<br />';
echo prim2::$a . '<br />';

prim0::re();
prim1::re();
prim2::re();


результат:

Код

a
d
e
--a-
--d-
--e-


Добавлено через 4 минуты и 14 секунд
однако, я проглядел один момент. вариант:

Код

abstract class prim0 {
    static public $a = 'a';
    static public function re() {
        echo '--'.static::$a.'-<br />';
    }
}
class prim1 extends prim0 {
}
class prim2 extends prim0 {
}

prim1::$a = 'd';
prim2::$a = 'e';

echo prim0::$a . '<br />';
echo prim1::$a . '<br />';
echo prim2::$a . '<br />';

prim0::re();
prim1::re();
prim2::re();



возвращает

Код

e
e
e
--e-
--e-
--e-

то есть без специального объявления свойства, происходит обращение к родительскому. можно ли это обойти? то есть не указывая специально, работать со свойствами наследника.
не вижу куда там ещё можно зануть static, ведь и так уже указано
PM MAIL WWW   Вверх
baldina
Дата 3.9.2014, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(bars80080 @  3.9.2014,  11:04 Найти цитируемый пост)
не указывая специально, работать со свойствами наследника

так ведь здесь статическая переменная лишь одна (в базовом классе). а когда объявляется переменная с тем же именем в производном классе, это еще одна переменная.

кстати вот вам пример с использованием трейтов и LSB: http://ideone.com/Za4Gh5

Цитата(bars80080 @  3.9.2014,  11:04 Найти цитируемый пост)
то есть без специального объявления свойства, происходит обращение к родительскому

используйте функции
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.