2

我定义了以下类(此处提供了代码段)...

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()我将闭包传回给 DBExecute()函数的函数中。这个函数所做的只是做一些完整性检查,然后执行 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 中克服这个问题,而不需要对我的代码库进行太多修改吗?在这种情况下,我有一点谷歌来尝试找出 .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 工作的重写?

提前致谢!

4

1 回答 1

2

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

class JEH_User 
{
// <snip>

protected function __construct(&$propertyHash)
{
    $this->usrVals = $propertyHash;
    // <snip>
}

public static function getInstance() {
      return new JEH_User();
}

并在您的调用代码中使用

 $instance = JEH_User::getInstance();
于 2013-07-07T11:01:53.033 回答