在php中,我们可以在另一个类中创建一个类的对象吗?我已经用php编写了一个小应用程序,现在正在尝试将整个代码转换为类-方法-对象。我现在感到困惑。
你可以这样做,但是否应该这样做取决于两个类的生命周期及它们之间的关系。基本上,你可以选择使用组合或聚合。
当创建的对象的生命周期等于或小于将使用它的对象时,可以使用组合,例如:
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;
}
}
与组合不同,这里没有所有权的暗示。 A
使用 DbAdapter
但当 A
被销毁时,DBAdapter
还存在。这是一种“使用”关系而不是“拥有”关系。
判断一个对象是否可以在运行时创建另一个对象的好方法可以在GRASP中的创建者模式中找到,它说明当对象含有或组成了A类实例、记录A类实例、紧密地使用A类实例或能够提供A类实例初始化信息并传递给它们进行创建时,对象可以在运行时创建其他对象。
或者,每当需要创建某个实例并聚合工厂实例时,就可以创建工厂,这将使您获得更清晰的协作者和创建者分离。
创建对象内部的问题是很难测试它们。当进行单元测试时,通常不希望重新创建和引导整个系统环境,而是集中于仅测试该特定类的隔离性。为了实现这一点,您可以使用Mock对象替换该类的依赖项。当您使用组合时,无法做到这一点。
因此,根据类的协作者的操作,您可能希望始终使用聚合,因为这样您就可以完全进行依赖注入,这将允许您轻松地替换类的协作者,例如用模拟代替它们。
可以这样做,但会增加代码耦合度并使测试更加困难。
我建议在类外部创建它,并将其作为参数传递(这称为依赖注入)。
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();
?>