首先,我不想扩展课程。我理想的是喜欢这样做。
public function __construct() {
/* Set Framework Variable */
global $Five;
$this =& $Five;
}
我有一个系统,其中变量$ Five是一个包含其他库的容器类。我可以将它分配给一个局部变量Five ...即
public function __construct() {
/* Set Framework Variable */
global $Five;
$this->Five = $Five;
}
但是,我试图避免这种情况的原因是函数调用会变得有点长。
$this->Five->load->library('library_name');
它有点难看。会好得多。
$this->load->library('library_name');
最佳解决方案是什么?
答案 0 :(得分:5)
我认为
$this->Five->load->library('library_name');
除非你决定让类扩展帮助类,否则将是你最好的选择。 AKA
class Something extends Helper_Class
但是,这意味着每次实例化一个类时都会实例化Helper_Class
。
另一种方法是使用伪静态类将所有辅助类分配给类成员
public function setGlobals($five)
{
$this->loader = $five->loader;
}
然后就叫它
public function __construct($five)
{
someClass::setGlobals($five);
}
如果$Five
是全局的,那么每次您想要使用它时都可以global $Five
,但将它放在每个函数的顶部只是看起来很糟糕。
另外,我只是想做我的公共服务公告,全局变量通常是一个坏主意,你可能想要搜索'依赖注入'或全局变量。 AKA
public function __construct($five);
而不是
global $five;
Globals依赖外部变量存在并且已经设置,而依赖注入请求一个变量,它假定它是Five类的一个实例。
如果你正在运行PHP 5.1(感谢Gordon),你可以通过这样做确保变量是FiveClass
的一个实例:
public function__construct(FiveClass $five);
答案 1 :(得分:2)
$ this是对您定义的类的当前实例的引用。我不相信你可以分配给它。如果Five是全球性的,你应该能够做到这一点:
$Five->load->library('library_name');
答案 2 :(得分:1)
您可能希望采用某种依赖注入模式的实现:
计算机中的依赖注入(DI) 编程指的是过程 为a提供外部依赖 软件组件。这是具体的 形式的控制反转的地方 被忽视的问题是这个过程 获得所需的依赖。
另见documentation for the symfony DI container。如果你想改进处理'全局变量'的方式,我强烈推荐这个DI容器实现。
您还可以阅读this question“访问全局对象的最佳方法”。
答案 3 :(得分:1)
如何制作五个静态类成员的相关数据成员和方法?此
$this->Five->load->library('library_name');
会成为这个
Five::load->library('library_name');
你无需在任何地方传递& $ Five。
答案 4 :(得分:1)
你不能覆盖$ this(例如在C ++中),但你可以使用aggregate为方法调用轻松地构建__call(),为属性调用__get(),__ set(),__ isset()。 / p>
__call()的示例:
class Five {
public function bar() {
echo __METHOD__, " invoked\n";
}
}
class Foo {
protected $Five = null;
public function __construct(Five $five=null) {
if ( is_object($five) ) {
$this->Five = $five;
}
}
public function __call($name, $args) {
// there's no accessible method {$name} in the call context
// let's see if there is one for the object stored in $five
// and if there is, call it.
$ctx = array($this->Five, $name);
if ( !is_null($this->Five) && is_callable($ctx) ) {
return call_user_func_array($ctx, $args);
}
else {
// ....
}
}
}
$foo = new Foo(new Five);
$foo->bar();
打印Five::bar invoked
。
在我看来,最大的缺点是,从外部看到对象的能力要困难得多。
答案 5 :(得分:0)
我很确定你不能重新分配$this
,因为它是PHP中变量看起来像变量的特殊事物之一,但在幕后却略有不同。
如果您的问题是调用时间太长的方法的语义,我会使load
方法调用而不是对象属性
$this->load()->library('library_name');
public function load()
{
return $this->Five;
}
答案 6 :(得分:0)
也许你会更好地使用PHP Magic Methods? http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods