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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Class extends 
:(
    Опции темы
MoLeX
  Дата 9.9.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


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

Репутация: 46
Всего: 140



Добрый день. 

Подскажите как осуществить такое расширение класса.
Есть головной класс
test.php 
Код

class Test {
   public function fun1()
   {
      echo 'Test<br />';
   }
}


и есть расширенный
test_hook.php
Код

class Test_hook extends Test {
   public function fun2()
   {
      echo 'Test_hook<br />';
   }
}



Возможно ли сделать следующий финт ушами:
Код

function __autoload( $class )
{
   require($class.'.php');
   require($class.'_hook.php');
}

$test = new Test();
$test->fun1();
$test->fun2();



или я хочу получить невозможное?

Это сообщение отредактировал(а) MoLeX - 9.9.2010, 11:30


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
skyboy
Дата 9.9.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 75
Всего: 260



Цитата(MoLeX @  9.9.2010,  10:29 Найти цитируемый пост)
или я хочу получить невозможное?

мне не совсем понятно, что ты хочешь сделать, но определенно: приведенный в конце сообщения код не имеет никакого отношения к наследованию(extends)
тебе надо определение класса "размазать" по нескольким файлам? тогда используй include
PM MAIL   Вверх
MoLeX
Дата 9.9.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


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

Репутация: 46
Всего: 140



skyboy, есть какой то базовый класс Test, мне надо расширить её с помощью второго класса Test_hook


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 9.9.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MoLeX, Тоесть. есть класс, test, который исправно где-то там работает и менять его не надо. Хочется, не меняя названия класса изменить его функционал?
После включения оригинального файла с классом сделать уже ничего нельзя. 
Если задача нечастая и нестрашно что медленная - можно при включении файла (в автолоде) текстово-регулярно подменить имя базового класса на какой-нибудь другой. сделать eval и потом честно описать наследника от этого другого с именем test.

Добавлено через 1 минуту и 55 секунд
Хотя, разумнее переименовать test в исходниках и не выпендриваться так ;)


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


неОпытный
****


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

Репутация: 75
Всего: 260



Цитата(ksnk @  9.9.2010,  11:24 Найти цитируемый пост)
После включения оригинального файла с классом сделать уже ничего нельзя. 

classkit_method_*. но не думаю, что molex'y это действительно надо.
PM MAIL   Вверх
MoLeX
Дата 10.9.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


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

Репутация: 46
Всего: 140



Цитата(ksnk @  9.9.2010,  12:24 Найти цитируемый пост)
сделать eval

хотелось бы без eval'a

Цитата(skyboy @  9.9.2010,  13:02 Найти цитируемый пост)
classkit

то, да оно по умолчанию не включено в РНР(

Добавлено через 12 секунд
будем продолжать искать варианты


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Muerto
Дата 10.9.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 4



Увы не понял суть проблемы...
Почему мы делаем
Код

$test = new Test();
$test->fun1();
$test->fun2();


А не делаем

Код

$test = new Test_hook();
$test->fun1();
$test->fun2();


Как мы можем хотеть использовать функцию которая никак не относиться к классу TEST ???

Для таких случаев мне кажется и придумали static

Код

Test_hook::fun1();
Test_hook::fun2();



Это сообщение отредактировал(а) Muerto - 10.9.2010, 17:22


--------------------
user posted image
PM MAIL   Вверх
ksnk
Дата 10.9.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Muerto, Представь, что в большом проекте все организованно оопно. Тоесть для каждой использемой фенечки существует свой класс, для каждого такого класса существует свой предок, у предка свой предок и так далее. Такая цепочка наследования фиксирует названия классов - предков, так как имя класса предка явно указано в описании наследника. Так что если нам приспичит поменять функциональность какого-то объекта в середине такой цепочки, и при этом изменять исходный текст "предка" нежелательно по религиозным соображениям, нам придется извращаться... За оопные жизненные принципы иногда надо платить smile 

Вариантов выхода из подобных тупичков придумано достаточно, но они базируются на архитектурных, изначально вставленных в проект возможностях. Например, можно использовать делегирование а не наследование, использовать фабрику. А такое изменение предполагает неслабый рефакторинг... 

Впрочем, возможно задача еще более заковыриста и я все неправильно понял. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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