2015-02-27 4 views
3

Мое я и еще один разработчик установили Lamp на две отдельные системы (Ubuntu & OSX), и по какой-то нечеткой причине пакет, который мы разрабатываем, больше не работает на PHP 5.5 (5.5 +0,9 в моем случае)Невозможно использовать переменные переменные для выполнения функции в PHP 5.5

Одна из областей, в частности, является:

if (method_exists($this, 'hook_' . __FUNCTION__)) { 
    $this->{'hook_' . __FUNCTION__}(); 
} 

Приведенные выше результаты кода в ошибке, заявляющие о том, что метод с именем hook_xxx не существует, однако, если мы заменим код:

if (method_exists($this, 'hook_' . __FUNCTION__)) { 
    call_user_func(array($this, 'hook_' . __FUNCTION__)); 
} 

Он отлично работает.

В довершение, это работает на PHP 5.4.33 ..

Я только что провел 2 дня fannying вокруг с PHPBrew и т.д., пытаясь получить PHP 5.4.33 правильно установлен и думаю, что решение на самом деле пытается чтобы выяснить, почему это в первую очередь.

Любые идеи?

Благодаря

Gavin


Ошибки я получаю:

Call to undefined method LocalController::hook_index() 

Где у меня есть:

<?php 

    class Controller 
    { 
     public function index() { 

      echo 'Parent index called'; 

      if (method_exists($this, 'hook_' . __FUNCTION__)) { 
       $this->{'hook_' . __FUNCTION__}(); 
      } 
     } 
    } 

    class LocalController extends Controller 
    { 
     public function hook_index() { 

      echo 'Child index called'; 

     } 
    } 

приложение это сам будет загружать в контроллер и то, если оно существует, i t будет загружаться в LocalController.

Это все работает нормально на 5.4, или если я меняю его на использование call_user_func, однако в противном случае умирает с вышеуказанной ошибкой.

+1

Какова точная ошибка, что вы получаете? – infomaniac

+0

Работает для меня, Mac OS X работает PHP 5.5.14. –

+0

Я полагаю, что это действительно поможет;) См. Выше – Gavin

ответ

2

Попробуйте сделать конкатенацию и вызвать в отдельных стадиях

 $f = 'hook_' . __FUNCTION__; 
     print('testing function ' . $f); 

     if (method_exists($this, $f)) { 
      $this->$f(); 
     } 
     $this->response->setOutput($this->render()); 
+0

Это работает, однако на самом деле не объясняет, почему метод фигурной скобки, который мы сейчас используем, больше не работает на PHP 5.5.9. Есть идеи? – Gavin

+0

PHP имеет некоторые причуды, когда дело доходит до операций вложенности. В целом он не справляется с гнездом. Он не может даже выполнять какую-либо функцию (массив (1,2,3)); –

+0

EDIT: ну последняя версия php, возможно, исправила проблему с массивом. В целом, PHP не самый логически разработанный язык :-) –

Смежные вопросы