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 :: унаследованный __call от абстрактного класса не срабатывает

 PHP.SU

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


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

> Без описания
mdsna
Отправлено: 10 Июля, 2014 - 21:18:54
Post Id


Новичок


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


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




Есть абстрактный класс, допустим
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. abstract class Framework_Base_Controller
  3. {
  4. ...
  5.     /**
  6.      * Do something before any action
  7.      */
  8.     protected function _beforeAction() {}
  9.  
  10.  
  11.     /**
  12.      * Do something after any action
  13.      */
  14.     protected function _afterAction() {}
  15.  
  16.     public function __call($name, $args) {
  17.  
  18.         var_dump(22222222);
  19.         if (!method_exists($this, $name)) {
  20.             return false;
  21.         }
  22.  
  23.         $reflection = new ReflectionMethod($this, $name);
  24.  
  25.         if (!$reflection->isPublic()) {
  26.             return false;
  27.         }
  28.  
  29.         $this->_beforeAction();
  30.         $result = call_user_func_array([$this, $name], $args);
  31.         $this->_afterAction();
  32.  
  33.         return $result;
  34.     }
  35.  
  36. ...
  37. }
  38.  


Далее я наследуюсь от этого класса и переопределяю свой _beforeAction, к примеру, как оказалось, он выполнился, когда я вывел через него 1111111111, ок, прямо в __call вставил var_dump(22222); и тоже ничего, почему так?
 
 Top
OrmaJever Модератор
Отправлено: 10 Июля, 2014 - 22:00:36
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




mdsna пишет:
Далее я наследуюсь от этого класса и переопределяю свой _beforeAction, к примеру, как оказалось, он выполнился, когда я вывел через него 1111111111, ок, прямо в __call вставил var_dump(22222); и тоже ничего, почему так?

а теперь вот это напишите кодом


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
mdsna
Отправлено: 10 Июля, 2014 - 22:12:15
Post Id


Новичок


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


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




OrmaJever пишет:
а теперь вот это напишите кодом

И так же написано что делаю, ну вот как-то так

PHP:
скопировать код в буфер обмена
  1.  
  2. class App_Some_Controller extends Framework_Base_Controller {
  3.  
  4. public function view()
  5. {...}
  6.  
  7. protected function _beforeAction()
  8. {
  9. var_dump(1111111);
  10. }
  11.  
  12. }
  13.  


Насколько я нагуглил, такое вроде как не прокатит, но такой функционал мне нужен, при этом не хочу трогать ни конструктор ни деструктор, они немного не для этого предназначены
 
 Top
OrmaJever Модератор
Отправлено: 10 Июля, 2014 - 22:22:45
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




mdsna пишет:
И так же написано что делаю

ну так оно и работает так как написано. Написали var_dump(1111111); вывелись единицы, почему должны вывестись двойки?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 10 Июля, 2014 - 22:29:41
Post Id



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


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


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




в App_Some_Controller вы вызываете метод view?
примерно так?

PHP:
скопировать код в буфер обмена
  1. $o = new App_Some_Controller();
  2. $0->view();


Если да, то, вызова __call() не будет. __call вызывается при обращении к несуществующему или недоступному методу. А метод view у вас публичный, он существует и доступен.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
mdsna
Отправлено: 10 Июля, 2014 - 22:32:22
Post Id


Новичок


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


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




OrmaJever пишет:
вывелись единицы

Как раз ничего не вывелось потому что

DelphinPRO пишет:
Если да, то, вызова __call() не будет. __call вызывается при обращении к несуществующему или недоступному методу. А метод view у вас публичный, он существует и доступен.

А, вот оно как, каким-то образом можно сделать подобное поведение другими способами?
 
 Top
DelphinPRO
Отправлено: 10 Июля, 2014 - 22:37:29
Post Id



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


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


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




ну сделайте метод view защищенным Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 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