我创建了一个扩展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并将其公开,但这将非常不方便。
你还有其他出路吗?
由于
答案 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
。什么时候发货?