【问题标题】:How does one define a PECL bbcode extension callback when writing a CodeIgniter library?在编写 CodeIgniter 库时如何定义 PECL bbcode 扩展回调?
【发布时间】: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-&gt;test() 扔到构造函数的底部,一切都会完全按照我的预期工作。但是,从其他地方(例如在控制器中)调用 $this-&gt;bbcode-&gt;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-&gt;bbcode-&gt;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


    【解决方案1】:

    我发现的唯一解决方案就是不在构造函数中设置处理程序。相反,parse() 方法包含 both bbcode_create() 调用和 bbcode_parse() 调用。也就是说,bbcode_handler 是为要解析的每个 bbcode 字符串新创建的。

    这对我来说似乎是不必要的浪费。但是,在这个项目的整个生命周期中,花费我试图“正确”解决这个问题所花费的时间的十分之一是极不可能的,所以我收工了。

    我在这里发布这个“解决方案”,以防其他人遇到这个问题,从而可以为自己节省几个小时的痛苦。也就是说,我真的很想知道到底发生了什么,以及如何正确地做到这一点。

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多