2010-08-20 166 views
1

我正在编写一个内容管理系统。页面管理员输入页面的内容,当他输入一个被特殊字符包围的数字时,它在解析时会被查看器屏幕上的数据库条目取代。为了在解析中实现这一点,我使用了preg_replace_callback()。但是,我无法将我的数据库连接变量传递给回调函数,因此它不起作用。作为一个短期的解决方法,我只是试图在这个实例中使数据库连接成为一个全局变量并以这种方式使用它,但这只不过是一个草率的混乱,而不是一个长期的好主意。将多个参数传递给回调函数(使用PHP 5.2)

有没有人知道如何解决我的问题,甚至是不同的,更好的方式来做我想做的事情?

回答

3

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

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 
); 
+0

你能使用'create_function()'? – 2010-08-20 01:35:01

+0

@彼得我认为这是一种憎恶......从一个字符串中创建一个函数......这是'eval'表兄弟。它不能解决问题,因为它不能创建一个绑定到外部变量的函数。我们回到'全球'。 – Artefacto 2010-08-20 01:37:26

+0

@Artefacto - 'create_function()'不带参数fwiw - 'string create_function(string $ args,string $ code)'。我理解有关'eval'的观点。 – 2010-08-20 01:40:10

0

在回调,你可以调用返回数据库连接的功能?例如,具有数据库连接的singleton class

0

Artefacto的答案是正确的(并且应该由OP接受),但为寻找一个更通用的解决方案,你可以参考this question on SE