call_user_func和变量引用

时间:2010-10-01 09:55:16

标签: php variables

那边是Hy。我正在开发插件系统,我遇到call_user_func和引用变量的问题。

我正在调用这样的插件处理程序:

    if(PluginFactory::NumberOfPlugins() != 0)
    foreach(PluginFactory::GetPlugins() as $pPlugin)
        call_user_func(get_class($pPlugin) . "::OnHandlePluggablePart", "Core:AfterSceneAssembly", $Document);

$Document是我保存控件的文档对象。这个想法是插件可以修改控件集(添加,删除,修改)。我的插件类是这样的:

class SomePlugin extends Plugin
{

    ...

    public static function OnHandlePluggablePart($sPart, &$Document)
    {
        if($sPart == "Core:AfterSceneAssembly")
        {
            $Document->AddControl(new Paragraph("", "Plugin test"));
        }
    }
}

文档对象按值(复制)传递而不是引用... 怎么做,做什么:)?

2 个答案:

答案 0 :(得分:2)

试试:

if(PluginFactory::NumberOfPlugins() != 0)
    foreach(PluginFactory::GetPlugins() as $pPlugin) {
        $class = get_class($pPlugin);
        $class::$transport = &$Document;
        call_user_func( $class."::OnHandlePluggablePart", "Core:AfterSceneAssembly");
    }

class Plugin {
    public static $transport;
    ...
}


class SomePlugin extends Plugin {

    ...

    public static function OnHandlePluggablePart($sPart) {
        if($sPart == "Core:AfterSceneAssembly") {
            self::$transport->AddControl(new Paragraph("", "Plugin test"));
        }
    }
}

答案 1 :(得分:0)

这是一个自包含的示例,可以正常使用php 5 并使用(大部分)来自问题的代码。

<?php
echo 'phpversion: ', phpversion(), "\n";

$Document = new MyDocument;
if(PluginFactory::NumberOfPlugins() != 0)
  foreach(PluginFactory::GetPlugins() as $pPlugin)
    call_user_func( get_class($pPlugin) . "::OnHandlePluggablePart", "Core:AfterSceneAssembly", $Document);

foreach( $Document->a as $a ) {
  echo '# ', $a, "\n";
}

class MyDocument {
  public $a = array();
  public function AddControl($s) {
    $this->a[] = $s;
  }
}

class PlugA {
  public static function OnHandlePluggablePart($sPart, $Document) {
    $Document->AddControl('PlugA-Control');
  }
}

class PlugB {
  public static function OnHandlePluggablePart($sPart, $Document) {
    $Document->AddControl('PlugB-Control');
  }
}

class PluginFactory {
  static $p = null;
  public static function NumberOfPlugins() {
    self::foo(); return count(self::$p);
  }
  public static function GetPlugins() {
    self::foo(); return self::$p;
  }
  public static function foo() {
    if ( is_null(self::$p) ) {
      self::$p = array(new PlugA, new PlugB);
    }
  }
}

打印

phpversion: 5.3.3
# PlugA-Control
# PlugB-Control