Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将一个类的实例传递给另一个类_Php_Oop_Class_Instance - Fatal编程技术网

PHP将一个类的实例传递给另一个类

PHP将一个类的实例传递给另一个类,php,oop,class,instance,Php,Oop,Class,Instance,我对PHP OO编程技术还是有点陌生,我有一个非常简单的问题,在一个类中实例化一个类,然后将该实例传递给另一个类,这通常是不好的做法吗 我想要的是能够创建一个特定类的实例,我知道通过每个用户请求我总是需要这个类。类2不仅仅是一个helper类,在我的应用程序中,理想情况下它是一个加载视图的“加载器” 第一个类调用其他两个类: require 'classTwo.php'; require 'classThree.php'; class first { public $classTwo

我对PHP OO编程技术还是有点陌生,我有一个非常简单的问题,在一个类中实例化一个类,然后将该实例传递给另一个类,这通常是不好的做法吗

我想要的是能够创建一个特定类的实例,我知道通过每个用户请求我总是需要这个类。类2不仅仅是一个helper类,在我的应用程序中,理想情况下它是一个加载视图的“加载器”

第一个类调用其他两个类:

require 'classTwo.php';
require 'classThree.php';

class first {
     public $classTwo, $classThree;

     public function __construct() {
          $this -> classTwo = new classTwo;
          $this -> classThree = new classThree;

          $this -> classThree -> displayNum( $this -> classTwo );

     }
}
第二个类是帮助器类:

class classTwo {
     public function returnVal() {
          return 123;
     }
}
第三类是动作类,实际工作和最终展示将在其中进行:

class classThree {
     public function displayNum( $instance ) {
          echo $instance -> returnVal();
     }
}
总的来说,我只是想知道这是否是一个糟糕的做法,因为我以前从未见过这样做


提前谢谢

是的。这将使对
第一个
类进行单元测试变得非常困难,因为其中有硬编码的依赖项


要么注入类的实例,要么注入工厂。

注入任何依赖对象是一种良好的做法,因为这允许您在单元测试期间非常轻松地进行模拟

一般来说,如果您有
ClassA
,并且它依赖
ClassB
的一个实例来运行,那么您可以执行以下操作:

$objectB = new ClassB();
$objectA = new ClassA($objectB);
看看

编辑:构造函数注入将依赖项传递到新对象的构造函数中(如上所示)

Setter注入使用一种方法来设置依赖项,通常在依赖项不重要时使用:

$objectB = new ClassB();
$objectA = new ClassA();
$objectA->setObjectB($objectB);

因为这是一个很好的问题,我希望在我第一次启动OOP时就提出这样的问题。一旦您熟悉Jaitsu答案中的链接所涵盖的依赖注入,我建议您看看,这是一个包含所有类和参数的DI容器。感谢@Adam-E,我完全同意,我已经研究并阅读了足够多的PHP OO技术,从来没有见过我以前使用的方法,我想问谁比堆栈溢出用户更好,我总是觉得非常有帮助。我一定会调查粉刺的谢谢!非常感谢@Jaitsu,你能告诉我为什么从实例化传递实例比从方法传递实例更好。@TomBird有两种注入类型,setter注入和构造函数注入。通常,如果依赖项是可选的,则使用setter注入,但如果您的对象必须接收另一个对象的实例才能工作,则使用构造函数注入