这更多是语义问题,而不是最佳实践。
在您的示例中,您的业务逻辑可能会确定动物始终需要名称。
所以用名字来构造对象是有意义的。如果您不想让
一个动物的名字要改,那你就不用写setter了。
即
class Animal
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
您可能拥有动物不需要的其他属性,例如主人
你只为 i.e. 编写一个 getter/setter
class Animal
{
private $name;
private $owner;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function setOwner($owner)
{
$this->owner = $owner
}
}
但是如果你发现你总是在同时创造一只动物和一个主人
为方便起见,您可能希望将其放在承包商签名中
class Animal
{
private $name;
private $owner;
public function __construct($name, $owner = null)
{
$this->name = $name;
$this->owner = $owner;
}
public function getName()
{
return $this->name;
}
public function setOwner(Owner $owner)
{
$this->owner = $owner
}
public function getOwner()
{
return $this->owner;
}
}
如果所有者是您应用程序中的另一个类,您可以键入提示您的构造函数
需要特定类型(类)的所有者。所有这些都是为了让您或其他开发人员更容易理解代码背后的一些要求/逻辑 - 以及可能在这里或那里发现错误
class Owner
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
}
class Animal
{
private $name;
private $owner;
public function __construct($name, Owner $owner = null)
{
$this->name = $name;
$this->owner = $owner;
}
public function getName()
{
return $this->name;
}
public function setOwner(Owner $owner)
{
$this->owner = $owner
}
public function getOwner()
{
return $this->owner;
}
}
// Create a new owner!
$dave = new Owner('Farmer Dave');
// a standard php empty object
$otherObj = new \stdClass();
// Create a new animal
$daisy = new Animal('Daisy');
// Farmer dave owns Daisy
$daisy->setOwner($dave);
// Throws an error, because this isn't an instance of Owner
$daisy->setOwner($otherObj);
// Set up Maude, with Dave as the owner, a bit less code than before!
$maude = new Animal('Maude', $dave);