PHP.SU

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


 Страниц (6): [1] 2 3 4 5 6 »   

> Без описания
Eazy-E
Отправлено: 28 Мая, 2012 - 03:07:32
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




Всем доброго времени суток. Имеется такой класс:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class MVC {
  5.  
  6. public function Model ($text) {
  7.  
  8. $text = '<i>' . $text . '</i>';
  9. return $text;
  10.  
  11. }
  12.  
  13. public function View ($text) {
  14.  
  15. $text = $Child::MakeTextBold($text);
  16. echo $text;
  17.  
  18. }
  19.  
  20. public function Controller () {
  21.  
  22. $text = 'Some text';
  23. $new_text = self::Model($text);
  24. self::View($new_text);
  25.  
  26. }
  27.  
  28. }
  29.  
  30. class NewClass extends MVC {
  31.  
  32. public function MakeTextBold ($text) {
  33.  
  34. $text = '<strong>' . $text . '</strong>';
  35. return $text;
  36.  
  37. }
  38.  
  39. }
  40.  
  41. ?>
  42.  



Как мы видим, в MVC::View() дочерний класс не определен. В этом и весь вопрос, как его определить? Точнее, как получить имя дочернего класса внутри родительского? Будем отталкиваться от того, что явно указать его нельзя. Да, и get_called_class() выводит имя родительского класса.


-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Мая, 2012 - 03:20:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Вообще - никак. Вы не должны этого хотеть.
Родитель не должен ничего знать о потомках.
Но можно заморочится и сделать некое св-во у родителя.
А во время создания экземпляра от потомка будет дергаться конструктор (?) родителя и туда вписываться ссылка на потомка.
Но этим ломается смысл наследования - потомков чаще более одного.

Если вам нужен доступ к "потомкам" как к зависимым классам/объектам, посмотрите в сторону "брокера" или "фабрики".
 
 Top
Eazy-E
Отправлено: 28 Мая, 2012 - 03:31:53
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




DeepVarvar, знаю, знаю не должен этого хотеть Улыбка но дело в том, что класс MVC в данном случае будет не доступен для редактирования (закрытый исходный код), а возможность расширять код при помощи плагинов, предоставить стороннему разработчику хочется (чтобы потом не кричали про закрытые исходники). Вот и вся проблема. В принципе, у меня есть еще одно решение этой проблемы (вполне работоспособное), просто хотелось найти альтернативу.


-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Мая, 2012 - 03:37:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Ой, ну и оставьте как есть коли работает.
Вот еще что нашел вам, 5.2 не пашет, а 5.3 уже ага: http://forum[dot]htmlbook[dot]ru/index[dot]p[dot][dot][dot]p?showtopic=7810
 
 Top
Eazy-E
Отправлено: 28 Мая, 2012 - 03:44:04
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




Спасибо, но там тоже советуют предопределить класс-потомок, чего на практике сделать будет нельзя. Оставлю как есть. В принципе, Контроллеры так-же можно сделать открытыми для редактирования.


-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
tato
Отправлено: 28 Мая, 2012 - 04:01:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


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




Eazy-E пишет:
а возможность расширять код


PHP:
скопировать код в буфер обмена
  1. class MyMvc extends Mvc {
  2.  
  3.     // override method
  4.     public fucntion view( $text )
  5.     {
  6.         echo $this->makeTextRed( $text );
  7.     }
  8.  
  9.     // my new method
  10.     private function makeTextRed( $text )
  11.     {
  12.          return "<font color=\"red\">$text</font>";
  13.     }
  14. }
  15.  
  16. $mvc = new MyMvc();
  17. $mvc->view( 'Work!' );


Я расширил Выш код, как сторонний разработчик.
А вообще то о чем Вы говорите решается абстракциями и интерфейсами, есть еще магические три буквы API, да вообще много чего напридумывали.

p.s. Полностью согласен с DeepVarvar, ломаете весь смысл наследования.

(Отредактировано автором: 28 Мая, 2012 - 04:06:37)



-----
просто ?: сложно
 
 Top
Bio man
Отправлено: 28 Мая, 2012 - 08:14:57
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Eazy-E пишет:
класс MVC
ОГО, щас это один класс?
Проблема в том, что Вы много хотите от одного класса. Нужно разделить ответственность, и задача должна описываться менее чем 25 словами с редкими вставками "и" или "или".
Задача вашего класса - хранить данные, форматировать и выводить контент и обрабатывать данные для модели и вида.
Как видно я сильно сократил описание но вставок "и" слишком много, и только из-за этого стоит разделить класс.

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

Вы же создаете проблемы на стадии кодирования и влечете за собой головную боль в дальнейшем, в сопровождении.
 
 Top
Eazy-E
Отправлено: 28 Мая, 2012 - 15:35:48
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




Bio man, возможно вы правы Улыбка Меня действительно мучает вопрос о возможности дальнейшего расширения проекта. Ведь как обычно бывает с такими проектами? Их хают, "because open source matters". Поэтому я и хочу сделать максимально функциональный внутренний API, чтобы не было нужды копаться в исходниках. И возможно, слишком много думая об этом, я упустил что-то важное. Но, вот пример:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class MVC {
  4.  
  5. public function Model ($text) {
  6.  
  7. $text = '<i>' . $text . '</i>';
  8. return $text;
  9.  
  10. }
  11.  
  12. public function View ($text) {
  13.  
  14. $text = $Child::MakeTextBold($text);
  15. echo $text;
  16.  
  17. }
  18.  
  19. public function Controller () {
  20.  
  21. $text = 'Some text';
  22. $new_text = self::Model($text);
  23. self::View($new_text);
  24.  
  25. }
  26.  
  27. }
  28.  
  29. ?>


Я хочу получить содержимое переменной $new_text из self::Controller() прежде, чем она будет передана в self::Vew(). Как мне это сделать?

(Отредактировано автором: 28 Мая, 2012 - 15:36:20)



-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
etoYA
Отправлено: 28 Мая, 2012 - 16:41:24
Post Id



Участник


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


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




Чо? Не понял

Bio man пишет:
ОГО, щас это один класс?


Eazy-E пишет:
public function Model
- как я понял это модель
Eazy-E пишет:
public function View
- хз что это, но вьюха - тоже модель!
 
 Top
Eazy-E
Отправлено: 28 Мая, 2012 - 16:57:34
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




etoYA, суть не в этом. если из вьюшки убрать это:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $text = $Child::MakeTextBold($text);

то будет вьюшка. но, суть не в этом.

(Отредактировано автором: 28 Мая, 2012 - 16:58:09)



-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
tato
Отправлено: 28 Мая, 2012 - 17:13:11
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


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




Ладно открою Вам секрет, если Вы все таки хотите убить ооп, получить имя
дочернего класса, можно вызвав get_class($this);

пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class bar {
  3.     public function __construct()
  4.     {
  5.         var_dump(get_class($this));
  6.         var_dump(get_class());
  7.     }
  8. }
  9.  
  10. class foo extends bar {
  11. }
  12.  
  13. new foo;
  14.  


ссылка в ман http://php.net/manual/ru/function.get-class.php

(Отредактировано автором: 28 Мая, 2012 - 17:13:42)



-----
просто ?: сложно
 
 Top
Eazy-E
Отправлено: 28 Мая, 2012 - 17:19:57
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




tato, не хочу его убивать, пусть живет, он мне нужен Улыбка суть первого поста уже давно отпала. и все же я еще раз прошу помощи с этим:

PHP:
скопировать код в буфер обмена
  1.     <?PHP
  2.      
  3.     class MVC {
  4.      
  5.     public function Model ($text) {
  6.      
  7.     $text = '<i>' . $text . '</i>';
  8.     return $text;
  9.      
  10.     }
  11.      
  12.     public function View ($text) {
  13.      
  14.     $text = $Child::MakeTextBold($text);
  15.     echo $text;
  16.      
  17.     }
  18.      
  19.     public function Controller () {
  20.      
  21.     $text = 'Some text';
  22.     $new_text = self::Model($text);
  23.     self::View($new_text);
  24.      
  25.     }
  26.      
  27.     }
  28.      
  29.     ?>




Я хочу получить содержимое переменной $new_text из self::Controller() прежде, чем она будет передана в self::Vew(). Как мне это сделать?


UPD


Целесообразней перенести тему в новый топик.

(Отредактировано автором: 28 Мая, 2012 - 17:37:54)



-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
etoYA
Отправлено: 28 Мая, 2012 - 17:58:25
Post Id



Участник


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


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




Eazy-E, для чего ты ее хочешь получить?

P.S ты ее и так получил, если получить не из этого класса, то обьяви свойство, в которое будешь записывать содержимое этой переменной

(Отредактировано автором: 28 Мая, 2012 - 17:58:36)

 
 Top
Eazy-E
Отправлено: 29 Мая, 2012 - 05:13:05
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


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




etoYA, что значит зачем? чтобы позволить разработчику работать с данными, получаемыми из модели (дабы не искажать архитектуру MVC, работать с данными можно и в самой модели. идея в том, чтобы позволить разработчику дополнить модель новыми возможностями без необходимости лезть в код самой модели. расширить ее извне) до того, как эти данные попадут в вьюшку и отрисуются. Это в частном случае мы имеем простую строку, а на практике это может быть все что угодно, вплоть до массива с данными. Неужели никогда не потребуется возможность переопределить данные из массива? или добавить новые данные в него, в зависимости от конкретной ситуации. Скажете что это бред? Не знаю. Если бред, то обоснуйте. Я действительно запутался в мыслях о расширяемости CMS с закрытым исходным кодом. Поэтому прошу у вас совета и помощи. Спасибо.

UPD
У меня есть одна идея для реализации задуманного, но сначала хочется услышать ваши предложения.

короче, вот нарисовал концепцию своего "хука":

Нажмите для увеличения

(Отредактировано автором: 29 Мая, 2012 - 06:47:37)



-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
DelphinPRO
Отправлено: 29 Мая, 2012 - 07:52:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 7190
Дата рег-ции: Февр. 2012  


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




откройте исходники любой CMS и посмотрите как там сделано. Практически все они имеют возможность написания расширений и дополнений. При этом в исходники ядра CMS в подавляющем большинстве случаев лезть не приходится.
А то, что вы пытаетесь изобрести - это, извините, хрень какая-то.


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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB