【发布时间】:2013-05-23 17:35:51
【问题描述】:
我正在寻找从另一个类调用类方法的最佳方式,而不必使用 Global 来获取类实例,因为我现在明白“全局是邪恶的”!
这里有一些代码来解释它:
class Assets{
public $assets = array();
public function add($asset){
$this->assets[] = $asset;
}
}
现在我想在这里调用 Assets/call 方法 ..
$assets = new Assets;
class Form{
public function __construct(){
global $assets;
$assets->add('Form');
}
}
在这种情况下使用 Global 是不是很糟糕?如果是这样,还有什么其他方式被认为是最好的?
PS:我只需要使用该类的一个实例;意味着我不想在第二个类中创建一个新实例。
【问题讨论】:
-
在每种情况下使用全局变量都是不好的。即使使用纯程序代码。
-
依赖注入是“语言提供和标准”的解决方案。你在 OOP 方面真的很糟糕。也许this list 有点帮助。
-
@Dewan159 我认为你从错误的角度看待这个问题,当一个人第一次开始深入研究 PHP 的 OOP 时,从程序方法开始并谈论“实践”时,这很常见.你明白为什么
global是“坏的”吗?尝试首先关注这一点。在直截了当地批评语言之前发展你对方法的知识,在寻求帮助时你会得到更好的接待。一旦您对注入的重要性有所了解(例如,它在整个 Java 世界中都在使用),优势就会更加明显。 -
@Dewan159 我没有对您的问题做出定性陈述:) 我只是注意到您提供的 sn-ps 证明了设计中的错误目标。您确定的弱点是除 PHP 之外的许多语言(Python、许多 JVM 语言、Ruby 都有一些可用的 DI 变体)几乎普遍接受的编码实践。它是 OOP 的支柱。您倾向于将此模式视为问题,这可能意味着您在编写代码时有一些错误的目标。你提到写一个框架......也许我们可以继续聊天?
-
@Dewan159:如果您不总是希望人们必须传递资产对象,那么就不要强迫他们使用构造函数。提供一个工厂类,您将资产实例传递一次,并让工厂始终构建您的表单类。