0

所以我有这样的事情:

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->view 的操作以将某些内容发送到视图,然后在视图中调用 $this->view 以获取发送的内容。我以为这是通过全局变量完成的...

4

4 回答 4

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();
    }
}

取决于您想要实现的目标以及您需要依赖项的频率。

于 2012-11-11T19:45:08.317 回答
1

首先,我要祝贺您找到一种将全局变量引入 Zend 框架的方法,因为它破坏了 Zend 框架的所有内容(OOP、MVC 架构等)。

其次,这是不好的做法。这是可能的,但也很糟糕。如果您发现自己在努力使用该语言做某事,那么很可能有一种更简单的方法来完成您正在尝试做的事情。

尽管这不是答案,但我恳请您更多地了解您的问题以及为什么要在另一个类中使用全局定义的类实例而不是抽象示例。很有可能,我们可以通过提供替代方法而不是灌输不良做法来帮助您成为更好的程序员来构建您的网站和 Web 应用程序。

于 2012-11-11T19:44:36.187 回答
0

我相信您需要的是“扩展”,我会给您举个例子。

class Hello {

    public function world() {
        echo 'Hello World!';
    }

}

class someClass extends Hello {

    public function doSomething() {
        $this->world();
    }
}


$obj = new someClass();
$obj->doSomething();
于 2012-11-11T19:50:40.583 回答
-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();
     }

    }
于 2012-11-11T19:57:47.433 回答