我们可以在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();
?>