2014-08-31 2 views
0

Почему в приведенном ниже упрощенном примере системных плагинов, передача по ссылке ($ data) не работает ($ content не изменяется)?Передача по ссылке не работает должным образом

class Plugins 
{ 
    public static function runhook() 
    { 
     $args = func_get_args(); 
     $hook = array_shift($args); 
     foreach ($args as &$a); // be able to pass $args by reference 
     call_user_func_array(array('Plugin', $hook), $args); 
    } 

} 

class Plugin 
{ 
    public static function modifData(&$data) 
    { 
     $data = 'Modified! :'.$data; 
    } 
} 

class Application 
{ 
    public $content; 

    public function __construct() 
    { 
     $this->content = 'Content from application...'; 
    } 

    public function test() 
    { 
     echo $this->content; // return 'Content from application...' 
     Plugins::runHoook('modifData', $this->content); 
     echo $this->content; // return 'Content from application...' instead of 'Modified! :Content from application...' 

    } 
} 

$app = new Application(); 
$app->test(); 

Как вы можете видеть $ this-> содержание должно быть изменено modifData() вызывается в фоновом режиме, runHook() функции класса Plugin. Но по какой-то странной причине ничего не ожидается, и переменная остается застрявшей в его первоначальном состоянии ... Может, я ошибаюсь?

Заранее спасибо за любую помощь ...

+2

'Плагины :: runHoook' не должны быть' Plugins :: runHook'? –

+0

Это потому, что вы только передаете ссылку на класс Plugin. Плагины :: runHook не получают ссылку – Pinoniq

+1

FWIT, вы можете просто передать весь объект, потому что объекты всегда передаются по ссылке. –

ответ

0

Не возможно с переменным количеством paramters (смотри также https://stackoverflow.com/a/7035513/684353).

Вы могли бы добиться этого с этим (повторить это на количество параметров, вы ожидаете, что не должно быть слишком много):

<?php 

class Plugins 
{ 
    public static function runHook($hook, &$param1) 
    { 
     $args = func_get_args(); 
    // call_user_func_array(array('Plugin', $hook), [$param1]); // doesn't work, probably can fix this but didn't seem necessary 
     Plugin::$hook($param1); 
    } 

} 

class Plugin 
{ 
    public static function modifData(&$data) 
    { 
     $data = 'Modified! :'.$data; 
    } 
} 

class Application 
{ 
    public $content; 

    public function __construct() 
    { 
     $this->content = 'Content from application...'; 
    } 

    public function test() 
    { 
     echo $this->content; // return 'Content from application...' 
     Plugins::runHook('modifData', $this->content); 
     echo $this->content; // return 'Content from application...' instead of 'Modified! :Content from application...' 

    } 
} 

$app = new Application(); 
$app->test(); 

Или ждать PHP 5.6 и надеемся, что ... token позволит это.

+0

Ну ладно, так что я мог бы найти очень долгое время если это просто невозможно! Спасибо за объяснение, я попробую что-то на основе вашего примера :) – Albertine

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