【发布时间】:2015-02-27 20:30:19
【问题描述】:
我正在围绕 PHP 的 bbcode PECL 扩展编写一个 CodeIgniter 库,但我在回调方面遇到了一些问题。
我在库构造函数中设置了处理程序:
function __construct() {
$basic = array(
'url' => array(
'type' => BBCODE_TYPE_OPTARG,
'open_tag' => '<a href="{PARAM}" rel="nofollow">',
'close_tag' => '</a>',
'childs'=>'i,b,u,strike,center,img',
'param_handling' => array($this, 'url')
)
);
$this->handler = bbcode_create($basic);
}
public function parse($bbcode_string) {
return bbcode_parse($this->handler, htmlentities($bbcode_string));
}
如您所见,这使用回调来处理允许进入 URL 的内容。我用它来插入一个“退出重定向”页面
public static function url($content, $argument) {
if (!$argument) $argument = $content;
$url = parse_url($argument);
if (!isset($url['host'])) {
if (strlen($argument) > 0 && $argument[0] != '/') return false;
$destination = '//'.$_SERVER['HTTP_HOST'].$argument;
} elseif ($url['host'] != $_SERVER['HTTP_HOST']) {
$destination = '//'.$_SERVER['HTTP_HOST'].'/exit?'.urlencode($argument);
} else {
$destination = $argument;
}
return htmlspecialchars($destination);
}
我还有一个小功能可以帮助我在工作时进行测试:
function test() {
$string = '[url]http://www.google.com[/url]';
echo '<pre>';
die($this->parse($string));
}
如果从库中调用 test() 方法,这一切都可以正常工作。例如,如果我将$this->test() 扔到构造函数的底部,一切都会完全按照我的预期工作。但是,从其他地方(例如在控制器中)调用 $this->bbcode->test(),我收到以下错误:
**A PHP Error was encountered**
Severity: Warning
Message: Invalid callback , no array or string given
Filename: libraries/bbcode.php
Line Number: 122
**A PHP Error was encountered**
Severity: Warning
Message: bbcode_parse(): function `' is not callable
Filename: libraries/bbcode.php
Line Number: 122
<a href="" rel="nofollow">http://www.google.com</a>
回调没有被执行,因此链接的href 属性为空。第 122 行指的是我的 parse 函数中的单行代码:
return bbcode_parse($this->handler, htmlentities($bbcode_string));
如何处理这个回调函数,以便在从控制器内部调用 $this->bbcode->test() 时可以找到它?
现在我更加困惑了……
因此,希望将这一切抛在脑后,我将这些回调函数放在一个帮助程序中,这样我就可以直接调用它们。所以我现在有这样的代码:
function __construct() {
$basic = array(
'url' => array(
'type' => BBCODE_TYPE_OPTARG,
'open_tag' => '<a href="{PARAM}" rel="nofollow">',
'close_tag' => '</a>',
'childs'=>'i,b,u,strike,center,img',
'param_handling' => 'bbcode_url'
)
);
$this->handler = bbcode_create($basic);
}
通过上述,我得到以下错误:
**A PHP Error was encountered**
Severity: Warning
Message: Invalid callback 6.7949295043945E-5, no array or string given
Filename: libraries/bbcode.php
Line Number: 176
**A PHP Error was encountered**
Severity: Warning
Message: bbcode_parse(): function `6.7949295043945E-5' is not callable
Filename: libraries/bbcode.php
Line Number: 176
(第176行是parse()函数的新位置)
嗯...我什至不知道发生了什么。数字6.7949295043945E-5 每次尝试都会改变。
【问题讨论】:
标签: php codeigniter callback bbcode pecl