【问题标题】:Passing more than one argument to a callback function (using PHP 5.2)将多个参数传递给回调函数(使用 PHP 5.2)
【发布时间】:2010-08-20 00:35:45
【问题描述】:

我正在编写一个内容管理系统。页面管理员输入一个页面的内容,当他输入一个被特殊字符包围的数字时,它会在解析时被查看者屏幕上的一个数据库条目替换。为了在解析中完成这个,我使用了 preg_replace_callback()。但是,我不能将我的数据库连接变量传递给回调函数,所以它不起作用。作为一种短期的解决方法,我只是试图在这个实例中使数据库连接成为全局变量并以这种方式使用它,但这只不过是一种草率的组合,从长远来看并不是一个好主意。

有谁知道如何解决我的问题,甚至是一种不同的、更好的方法来做我想做的事情?

【问题讨论】:

    标签: php callback arguments


    【解决方案1】:

    您必须创建一个包装它的函数/方法。

    class PregCallbackWrap {
        private $dbcon;
        function __construct($dbcon) { $this->dbcon = $dbcon; }
        function callback(array $matches) {
            /* implementation of your callback here. You can use $this->dbcon */
        }
    }
    $dbcon = /* ... */
    preg_replace_callback('/PATTERN/',
        array(new PregCallbackWrap($dbcon), 'callback'), $subject,);
    

    在 PHP 5.3 中,您可以这样做:

    $dbcon = /* ... */
    preg_replace_callback('/PATTERN/',
        function (array $matches) use ($dbcon) {
            /* implementation here */
        },
        $subject
    );
    

    【讨论】:

    • 你能用create_function()吗?
    • @Peter 我认为这是可憎的...从字符串创建函数...它是eval 表亲。而且它不会解决问题,因为它无法创建绑定到外部变量的函数。我们回到global
    • @Artefacto - create_function() 确实接受参数 fwiw - string create_function ( string $args , string $code )。我理解eval 的意思。
    • @Peter 问题是您不能将这些参数传递给preg_callback_function,以便将它们传递回函数。这正是 OP 的问题(见他的问题)。
    • @Artefacto - 哦,是的。顺便说一句,preg_callback_function() 的参数顺序是 patterncallbacksubject,而不是 patternsubjectcallback - php.net/manual/en/function.preg-replace-callback.php
    【解决方案2】:

    在回调中,你可以调用一个返回数据库连接的函数吗?例如具有数据库连接的singleton class

    【讨论】:

      【解决方案3】:

      Artefacto 的回答是正确的(应该被 OP 接受),但对于任何寻求更通用解决方案的人,您可以参考this question on SE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多