我们可以在 php 中在另一个类中创建类的对象吗?


Can we create an object of a class inside another class in php?

我们可以在php中在另一个类中创建类的对象吗?我在php中做了一个小应用程序,现在我正在尝试以类方法对象的方式转换整个代码。我现在很困惑。

你可以

这样做,但是否应该取决于两个类的生存期以及它们之间的关系。基本上,您可以在组合和聚合之间进行选择。

组成

当创建的对象生存期等于或小于将使用它的对象时,您可以使用合成,例如

class A 
{
    private $belongsToAOnly;
    public function __construct()
    {
        $this->belongsToAOnly = new IBelongToA;
    }
}

在这种情况下,A"拥有"IBelongToA.当A被摧毁时,IBelongToA也被摧毁。它不能独立存在,可能只是A的实现细节。它可以是像Money这样的 ValueObject 或其他数据类型。

来自Craig Larman的"应用UML和模式":

复合体负责创建和删除其部件 - 通过自己创建/删除部件,或通过与其他对象协作。与此约束相关的是,如果复合材料被破坏,其部件必须被破坏,或附着到另一个复合材料上。

集合体

当所创建对象的生存期较长时,您可以使用聚合:

class A 
{
    private $dbAdapter;
    public function __construct(DbAdapter $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }
}

与构图不同,这里没有所有权的含义。 A使用DbAdapter但当A被摧毁时DBAdapter会继续存在。这是一种"使用"关系,而不是"拥有"关系。

创建者模式 (GRASP(

在 GRASP 中的创建者模式中可以找到一个很好的启发式方法,用于确定一个对象何时可以在运行时创建另一个对象,该模式指出对象可以在以下情况下创建其他对象

  • B 的实例包含或复合聚合 A 的实例
  • B 的实例
  • 记录 A 的实例
  • B 的实例紧密使用 A 的实例
  • B 的实例具有 A 实例的初始化信息,并在创建时传递它。

或者,您可以在需要创建某些内容的实例并聚合工厂实例时创建工厂,这将使协作者和创建者更清晰地分离。

测试

在对象中创建对象产生的一个问题是它们难以测试。当您进行单元测试时,您通常不希望重新创建和引导整个系统环境,而是专注于单独测试该特定类。为此,您需要将该类的依赖项与模拟对象交换。使用合成时无法执行此操作。

因此,根据类的协作者

所做的事情,您可能希望决定始终使用聚合,因为这样您就可以有效地一直进行依赖注入,这将允许您轻松交换类的协作者,例如用模拟替换它们。

是的,你可以,但这会增加代码耦合并使测试更加困难。
我建议在类外创建它并将其作为参数传递(它被称为依赖注入(。

class Foo
{
}
class Bar
{
  public function __construct(Foo $foo)
  {
    $this->foo = $foo;
  }
}
$foo = new Foo();
$bar = new Bar($foo);

是的,你可以做到..

这里有一个例子..

a.php
<?php
    class a{
        public function function_1(){
           echo "b";
        }
     }
?>

b.php
<?php
     include_once ("a.php");
     class b{
        public function function_b(){
             $a = new a;
             $a->function_1();
        }
      }
      $b= new b;
      $b->function_b();
 ?>

是的,您可以从另一个类内部从特定类创建对象。

class SomeClass{
}
class SomeOtherClass {
     function hello(){
         $o = new SomeClass;
     }
}

是的,您也可以在类中定义函数。您可以在 php 的课堂上做所有事情,请将您的代码发布在您感到困惑的地方。

例子:类中的对象。

class Foo
{
   public $bar; // another object!
   public __construct()
   {
      $this->bar = new Bar();
    }
}

(全局(类中的函数

<?php
    class Foo
    {
        public function __construct()
        {
            function __construct()
            {
                echo "Yes, I'm a global function!";
            }
        }
    }
    new Foo();
    __construct();
?>