[英]Can we create an object of a class inside another class in php?
我们可以在php的另一个类中创建一个类的对象吗?我已经在php中创建了一个小应用程序,现在我正试图以类方法对象的方式转换整个代码。我现在很困惑。
您可以执行此操作,但是是否应该取决于两个类的生存期以及它们之间的关系。 基本上,您可以在Composition和Aggregation之间进行选择。
当创建的对象的生存期小于或等于使用该对象的生存期时,可以使用“合成”。
class A
{
private $belongsToAOnly;
public function __construct()
{
$this->belongsToAOnly = new IBelongToA;
}
}
在这种情况下A
“拥有” IBelongToA
。 当A
被销毁时, IBelongToA
也被销毁。 它不能靠自己生存,而可能只是A
的实现细节。 它可以是ValueObject,例如Money
或其他数据类型。
摘自Craig Larman的“应用UML和模式”:
复合材料负责创建和删除其部件-通过自身创建/删除部件,或与其他对象协作。 与该约束有关的是,如果复合材料被破坏,则其部件必须被破坏,或连接到另一个复合材料上。”
当创建的对象的生存期较长时,可以使用“聚合”:
class A
{
private $dbAdapter;
public function __construct(DbAdapter $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
}
与Composition不同,这里没有所有权的含义。 A
使用DbAdapter
但是当A
被销毁时, DBAdapter
存在。 这是“使用”关系而不是“所有者”关系。
可以在GRASP的“ 创建者模式”中找到一种很好的启发式方法来决定某个对象何时可以在运行时创建另一个对象,该声明指出对象可以在运行时创建其他对象。
- B的实例包含或组合汇总了A的实例
- B的实例记录A的实例
- B的实例紧密使用A的实例
- B的实例具有A的实例的初始化信息,并在创建时传递它。
另外,您可以在需要创建某事实例并汇总工厂实例时创建工厂,这将使协作者和创建者之间的分离更加清晰。
在对象内创建对象产生的问题是它们很难测试。 在进行单元测试时,通常不希望重新创建和引导整个系统环境,而是专注于单独测试特定的类。 为此,您可以使用Mock Objects替换该类的依赖项。 使用合成时,您将无法做到这一点。
因此,根据类的协作者所做的事情,您可能希望决定始终使用聚合,因为这样一来,您就可以有效地一直进行依赖注入 ,这将使您可以轻松地换出类的协作者,例如替换他们与Mo子。
是的,您可以,但是这会增加代码耦合并增加测试难度。
我建议在类外创建它,并将其作为参数传递(称为依赖注入)。
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();
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.