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
Форумы портала PHP.SU :: Версия для печати :: унаследованный __call от абстрактного класса не срабатывает
Форумы портала PHP.SU » » Объектно-ориентированное программирование » унаследованный __call от абстрактного класса не срабатывает

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

1. mdsna - 10 Июля, 2014 - 21:18:54 - перейти к сообщению
Есть абстрактный класс, допустим
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); и тоже ничего, почему так?
2. OrmaJever - 10 Июля, 2014 - 22:00:36 - перейти к сообщению
mdsna пишет:
Далее я наследуюсь от этого класса и переопределяю свой _beforeAction, к примеру, как оказалось, он выполнился, когда я вывел через него 1111111111, ок, прямо в __call вставил var_dump(22222); и тоже ничего, почему так?

а теперь вот это напишите кодом
3. mdsna - 10 Июля, 2014 - 22:12:15 - перейти к сообщению
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.  


Насколько я нагуглил, такое вроде как не прокатит, но такой функционал мне нужен, при этом не хочу трогать ни конструктор ни деструктор, они немного не для этого предназначены
4. OrmaJever - 10 Июля, 2014 - 22:22:45 - перейти к сообщению
mdsna пишет:
И так же написано что делаю

ну так оно и работает так как написано. Написали var_dump(1111111); вывелись единицы, почему должны вывестись двойки?
5. DelphinPRO - 10 Июля, 2014 - 22:29:41 - перейти к сообщению
в App_Some_Controller вы вызываете метод view?
примерно так?

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


Если да, то, вызова __call() не будет. __call вызывается при обращении к несуществующему или недоступному методу. А метод view у вас публичный, он существует и доступен.
6. mdsna - 10 Июля, 2014 - 22:32:22 - перейти к сообщению
OrmaJever пишет:
вывелись единицы

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

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

А, вот оно как, каким-то образом можно сделать подобное поведение другими способами?
7. DelphinPRO - 10 Июля, 2014 - 22:37:29 - перейти к сообщению
ну сделайте метод view защищенным Улыбка

 

Powered by ExBB FM 1.0 RC1