class someClass
{
public function truncate($content, $amount = false)
{
if (!$amount || preg_match_all("/\s+/", $content, $junk) <= $amount) return $content;
$content = preg_replace_callback("/(<\/?[^>]+\s+[^>]*>)/", array($this, '_shield'), $content);
......
return $truncate;
}
...
private function _shield($matches)
{
return preg_replace("/\s/", "\x01", $matches[0]);
}
...
private function _unshield($strings)
{
return preg_replace("/\x01/", " ", $strings);
}
...
}
根据PHP Manual,preg_replace_callback
的第二个参数应该是一个处理函数,在上面的代码中,它是array($this, '_shield')
,我相信它会返回该类的私有函数之一“ _shield”。有人可以向我解释为什么array(class,privateFunctionName)
将返回私有函数吗?是否有关于此的PHP手册页?
根据手册,第二个参数应为callable(如manual中所定义),并且array($this, '_shield')
是正确的:它确定$this->_shield()
应该用作处理函数替换
[如果查看Callbacks / Callables的示例,则会看到指定对象和类方法array('object/class, 'method')
的不同方法。
如果您想知道为什么要使用私有,那是因为$this
是当前对象,当然可以访问它自己的私有方法。
如果另一个类别中的array('someDifferentClass', '_shield')
为array($someObj, '_shield')
,则[_shield()
和private
将不起作用。
您也可以使用匿名功能:
$content = preg_replace_callback("/(<\/?[^>]+\s+[^>]*>)/",
function($M) {
return $this->_shield($v);
}, $content);