【问题标题】:Overloading static properties with PHP用 PHP 重载静态属性
【发布时间】:2011-01-11 15:58:05
【问题描述】:

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

Codeigniter 目前加载这样的库:

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

不用说,这是一大堆代码,可以用更少的东西来实现。

我想像这样访问我的库:

_Lib::name->method();

然后_Lib 类将负责加载正确的库(或在这种情况下将该库的加载定向到加载器类)。

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

我的最终目标是能够与库对话并让它们以尽可能少的代码按需加载,并且无需初始化全局变量。

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

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

编辑:

我最终创建了一个默认库,我从中扩展了我的库,默认库具有将其他库(或模型,或助手,或..等)加载到适当的加载器的属性,所以我可以这样做

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

感谢大家的回答

【问题讨论】:

  • 对不起,_Lib::name->method(); 之间的真正区别是什么?和 _Lib('name')->method() ?两个字符?这真的不是很多,是吗?几乎没有“乏味”。如果是的话,我可以推荐一个可以帮助你的编辑器吗?
  • 这只是个人喜好,我不喜欢在不是绝对需要的地方使用带引号的字符串。我实际上使用带有制表符完成的 Komodo,所以你是对的,这并不乏味。我只是说乏味,因为没有更好的词。

标签: php overloading static-libraries


【解决方案1】:

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

【讨论】:

  • 你说得对,那是我的错误。我使用 CodeIgniter 太久了,我忘记了如何使用静态类 :) 谢谢。
【解决方案2】:

“意外的T_OBJECT_OPERATOR”错误意味着您对_Lib::name 的调用没有返回一个对象,从该对象链接方法调用。从技术上讲,_Lib::name_Lib 中返回类常量name 的值。你正在尝试做

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

但是常量不能保存对象,所以没有->

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

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

【讨论】:

  • 感谢您的回复 Gordon,但这是语法检查给我的错误,它与可用的属性无关。此外,我只是提供 CI->load->library() 函数的快捷方式(或尝试),我没有覆盖它。
  • @Nathan 对不起,我的错。它不是指类属性,而是一个常量。一样的效果。当 PHP 解析代码时你已经得到错误的原因是因为常量不能是对象,因此在获取 1 的值后你不能使用 -> (T_OBJECT_OPERATOR)。
猜你喜欢
  • 2014-02-18
  • 2021-07-22
  • 2018-04-18
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
相关资源
最近更新 更多