PHP OOP在create_function中调用私有函数作为回调

时间:2012-02-10 14:42:15

标签: php oop

我创建了一个扩展SimpleXMLElement的类,该类加载包含多语言网站翻译的XML。 在这个类中有两个私有函数 - get和translate。 前者返回由作为参数传递的xpath访问的节点中包含的转换。

后者用字符串替换类似标签的子串(例如,“Lorem ipsum#{dolor} sit amet,consectetur adipiscing elit。”)他们的翻译通过 前一个函数 - 标签是我在get()函数中处理的一种xpath。

我在translate()中使用preg_replace_callback - 因为我无法将后引用作为参数传递给preg_replace中的函数 - 将匹配的事件发送到get(),这将用转换替换它们。

以下是我班级的缩短版本:

$translation = new Translation('path_to_my_xml', null, true);

class Translation extends SimpleXMLElement {
    function get($xpath){
        // xpath is of the form 'parent_node/child_node'
        // After some processing and the wanted node being found - it returns the translation
    }

    function translate($string){
        $string = preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', create_function('$matches', 'return $this->get($matches[1]);'), $string);
    }
}

当然,我遇到了一个致命的错误:在不在对象上下文中时使用$ this,因为我的create_function调用中没有实例化类 - 我尝试了self::get($matches[1])但没有成功。
这些函数不能公开,因为我的类是SimpleXMLElement的扩展,它需要构造函数中的XML路径。 所以我不能这样做:create_function('$matches', 'return Translation::get($matches[1]);')

我希望我清楚自己。我看到的唯一解决方法是在我的translate()函数中将路径传递给我的XML并将其公开,但这将非常不方便。 你还有其他出路吗?

由于

4 个答案:

答案 0 :(得分:3)

坚持,你不能只使用像这样的旧式数组PHP回调吗?

function translate($string){
    $string = preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', 
                                    array($this, 'translateCallback'), 
                                    $string);
}

public function translateCallback($matches)
{
  return return $this->get($matches[1]);
}

答案 1 :(得分:2)

1:

preg_replace_callback($regexp, array($this, 'someMethod'), $string)

2:

$myFunc = function($matches) use ($this) ...
...
preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', $myFunc, $string)

3: 覆盖翻译中的__construct以保存最后一个实例,实现Translation :: getLastInstance()并在create_function中使用它或实现使用最后一个实例的Translation :: get($ m)并将其作为数组传递给preg_replace_callback('Translation','get' ),或者只是在preg_replace_callback链接到当前实例之前保存到self :: $ currentInstance。 在任何情况下,sence都是将实例的链接保存到Translation

的静态属性中

答案 2 :(得分:0)

在PHP 5.4中添加了在lambda / anonymous函数中使用$ this的工具,怀疑这是类似的;但是我必须跑上我的试验台来检查。

你可以尝试:

$string = preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', function($matches) use ($this) { return $this->get($matches[1]); }, $string); 

答案 3 :(得分:0)

可能不是非常有用,但在PHP 5.4中,匿名函数可以访问$this。什么时候发货?