我定义了以下类(此处提供了片段)。。。
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();