正在从闭包调用受保护的__construct..在5.4.14中工作,而不是在5.3中


Calling protected __construct from closure... works in 5.4.14, not in 5.3?

我定义了以下类(此处提供了片段)。。。

class JEH_User
{
    // <snip>
    protected function __construct(&$propertyHash)
    {
        $this->usrVals = $propertyHash;
        // <snip>
    }
    // <snip>
    static public function FindAll()
    {
        $retAry = Array();
        $db = JEH_DBase::GetDBase();
        $db->LockTables( Array( '__JEH_USER' => JEH_DBase::LOCK4READ) );
        $db->Execute(
                "SELECT * from __JEH_USER;",
                Array(),
                function ($r) use (&$retAry) {
                    $retAry[] = new JEH_User($r);
                    return TRUE;
                } );
        $db->UnlockAllTables();
        return $retAry;
    }   
    // <snip>
}

我的问题是。。。最初(我承认,我没有真正考虑为什么它应该或不应该工作)在函数FindAll()中,我通过DB Execute()函数将闭包传递回。这个函数所做的只是做一些健全性检查,然后执行SQL,然后对返回的每一行调用该行的闭包/回调。

问题是,在PHP 5.4(.14)中,这是可行的。闭包似乎绑定到正在创建的类上下文,因此可以调用protected __construct()构造函数。在我的提供者运行的5.3(.23)中,情况并非如此,它抱怨

Fatal error: Call to protected JEH_User::__construct() from invalid context in ... <snip>

所以,我的问题是,在PHP 5.3中,如果我的代码库没有太多mod,我能克服这一点吗?我在谷歌上搜索了一下,试图找出这种情况下.3和.4之间的区别。我看过Closure::bind()的功能,但这是5.4…

此外,手册上写着

5.4.0   $this can be used in anonymous functions.
5.3.0   Anonymous functions become available.

天哪!有人知道任何"快速"修复程序吗?或者这是一个为PHP 5.3重写的工作吗?

提前感谢!

您可以从一个著名的模式中获取一些代码,并拥有一个返回类实例的静态方法。

class JEH_User 
{
// <snip>
protected function __construct(&$propertyHash)
{
    $this->usrVals = $propertyHash;
    // <snip>
}
public static function getInstance() {
      return new JEH_User();
}

并且在您的呼叫代码中使用

 $instance = JEH_User::getInstance();