所以我有这样的事情:
class SomeClass{
//do some stuff
}
$variable = new SomeClass();
现在,在一个名为SomeClass.php的php文件中,我想在其他一些名为OtherClass.php的类中做类似的事情:
class OtherClass{
function doSomething(){
$variable->call_some_method();
}
}
我将如何实现这一目标?我已经想到了全局变量,但后来我看到像Zend这样的框架做了类似的事情:$ this-> view-> what_i_want_to_pass_to_the_view ='hello apple sauce';
那么这是一个很好的方法,基本上就是我想做的事情。
注意:有些人假设我想做全局变量,但事实并非如此。我试图复制Zend如何在类中使用$ this->视图向视图发送内容然后在视图中调用$ this-> view来获取发送的内容。我以为这是通过全局变量完成的......
答案 0 :(得分:4)
这个概念被称为“依赖注入”,被认为是做到这一点的最佳实践。
class SomeClass{
//do some stuff
}
$some = new SomeClass();
class OtherClass{
function doSomething(SomeClass $some){
$some->call_some_method();
}
}
$otherclass = new OtherClass();
$otherclass->doSomething($some);
或者,你可以只注入构造时间的依赖:
class OtherClass{
private $some = null;
function __construct(SomeClass $some){
$this->some = $some;
}
function doSomething(){
$this->some->call_some_method();
}
}
取决于您想要实现的目标以及您需要依赖的频率。
答案 1 :(得分:1)
首先,我想祝贺你找到一种方法将全局变量引入Zend Framework,因为它打破了Zend Framework的一切(OOP,MVC架构等)。
其次,这是不好的做法。这是可能的,但也很糟糕。如果你发现自己正在努力用这种语言做某事,那么很有可能更容易实现你想要做的事情。
虽然这不是一个答案,但我恳请你更多地透露你的问题和为什么你想要在另一个类中使用全局定义的类实例而不是一个抽象的例子。有机会,我们可以通过提供替代方法帮助您成为更好的程序员,而不是为您构建网站和Web应用程序灌输不良做法。
答案 2 :(得分:0)
我相信你需要的是'延伸'我会给你一个例子。
class Hello {
public function world() {
echo 'Hello World!';
}
}
class someClass extends Hello {
public function doSomething() {
$this->world();
}
}
$obj = new someClass();
$obj->doSomething();
答案 3 :(得分:-1)
有几种方法可以做到:
1)扩展SomeClass
class OtherClass extends SomeClass
{
function doSomething(){
$this->call_some_someclass_method();
}
}
2)将SomeClass实例传递给OtherClass(不是很好的编码实践)
$a = new SomeClass();
$b = new OtherClass();
$b->someInstance($a);
class OtherClass extends SomeClass
{
function someInstance($someClass){
$this->someClass = $someClass;
}
function doSomething(){
$this->someClass->call_some_method();
}
}
3)在OtherClass
中创建一个实例class OtherClass extends SomeClass
{
function someInstance(){
$this->someClass = new SomeClass;
}
function doSomething(){
$this->someInstance();
$this->someClass->call_some_method();
}
}