2013-09-06 3 views
2

Код:.Не удается передать параметр 2 по ссылке

final class SimpleEventManager { 
    private $listeners = array(); 

    public function listen($event, $callable) { 
     $this->listeners[$event][] = $callable; 
    } 

    public function fire($event, array $arguments = array()) { 
     foreach ($this->listeners[$event] as $listener) { 
      call_user_func_array($listener, $arguments); 
     } 
    } 
} 

$manager = new SimpleEventManager; 
$manager->listen('sql', function($sql) { 
    $sql .= " order by username desc"; 
}); 
$sql = "select * from users"; 
$manager->fire('sql', array($sql)); 
var_dump($sql); // is: select * from users 
       // want: select * from users order by username desc 

Поэтому в основном я хочу, чтобы мои слушатели событий, чтобы иметь возможность изменить аргументы, которые приходят в Я пытался делать такие вещи, как array &$arguments = array(), но тогда я получив ошибку Cannot pass parameter 2 by reference.

Кто-нибудь знает, как я могу это решить?

+1

Измените функцию * * принять аргумент по ссылке. 'public function fire ($ event, & $ arguments)' –

+0

Не ответ, но почему вы вызываете foreach? '$ this-> listeners [$ event]' не является массивом. – OneOfOne

+0

@cale_b Я не уверен, что вы имеете в виду, не могли бы вы привести пример с большим кодом? Я попытался использовать 'fire ($ event, & $ arguments)', но затем я получаю ту же ошибку в '$ manager-> fire ('sql', array ($ sql))' – user2538584

ответ

2

Вы не можете передать его ссылкой, поскольку только переменная может передаваться по ссылке. Литерал array($sql) явно не является переменной.

Это не проблема.

В самом деле, есть много проблем, в основном из-за $sql быть «скопированы» так много раз:

  1. При создании array($sql)
  2. При вызове fire() (из-за не передается по ссылке)
  3. При вызове анонимной функции (опять же, не передается по ссылке)

Прежде всего, вам нужно определить свой массив в качестве переменной, такой как $arr = array(&$sql);

Затем сохраните текущее «исправление» прохождения &$arguments по ссылке.

Наконец, настройте свою анонимную функцию на function(&$sql), чтобы также работать по ссылке.

В общем, это можно было бы сделать намного проще, если ваш код не были настолько запутанным;)

+0

Спасибо, что сработал! Как бы вы сделали это проще, если я могу спросить? – user2538584

+0

Um ... '$ sql =" select * from users order by username desc ";'? –