使用PHP重载静态属性

时间:2011-01-11 15:58:06

标签: php overloading static-libraries

我正在尝试自动化在我使用的框架(CodeIgniter)中访问库的过程,但我遇到了一些问题。

Codeigniter目前加载这样的库:

$this->CI->load->library('name');
$this->CI->name->method();

毋庸置疑,这是一大堆可以用更少的东西实现的代码。

我想像这样访问我的lib:

_Lib::name->method();

然后_Lib类将负责加载正确的lib(或者在这种情况下指示将lib加载到loader类)。

但是,上面的代码导致错误“意外的T_OBJECT_OPERATOR”。

我的最终目标是能够与库进行通信,并使用尽可能少的代码按需加载,而无需初始化全局变量。

有什么想法吗?请记住,它需要看起来尽可能可用且不言自明。

我想避免使用像_Lib('name') - > method()这样的东西,因为每次写这个都很繁琐。

修改

我最终创建了一个默认的库,我扩展了我的库,默认的库具有指向其他库(或模型,或者帮助器,或者等等)加载到appropreate loader的属性,所以我可以做

$this->lib->name->method();

感谢大家的回答

2 个答案:

答案 0 :(得分:2)

“意外T_OBJECT_OPERATOR”错误表示您对_Lib::name的调用未返回从中锁定方法调用的对象。从技术上讲,_Lib::name会在name中返回类常量_Lib的值。你正在尝试

class _Lib
{
    const name;
}
_Lib::name->method();

但常量不能保存对象,因此没有->

您不希望将库转换为静态调用because anything static couples to the global scope and is much harder to test。继续使用CI提供的开箱即用。

如果您想让一个班级全局管理其他班级,请考虑使用Dependency Injection Container,就像Symfony Components中提供的那样。

答案 1 :(得分:2)

你编写它的方式,_Lib :: name是一个类常量。您的意思是_Lib::$name->method();吗?