我的意思是我需要使用define()
设置对象,然后再将其传递给我的类方法吗?或者它被认为是常量,因为它被引用使用?我想我对手册的信息有误解。
class User
{
private $pdo = false;
...
public function __construct($pdo)
{
$this->pdo = $pdo;
}
...
}
$pdo = new PDO(...);
$user = new User($pdo);
VS
class User
{
private $pdo = false;
...
public function __construct($pdo)
{
$this->pdo = $pdo;
}
...
}
define(MYPDO, new PDO(...));
$user = new User(MYPDO);
我正在读取PHP manual对作为对象的属性的引用,并指出初始化必须是常量,以便可以在编译时对其进行评估。
读了几遍后,我应该采用哪种方式,因为它不会在类定义中实例化。
如果我理解正确,手册所指的是在类定义中定义对象而不是将值传递给属性。
我正在将PDO对象传递给每个函数,因为我使用它们,所以我想在构造时尝试传递一次。或者,这是个坏主意吗?
我不确定这样做是否有任何好处,我只是想更好地理解OOP。
答案 0 :(得分:3)
在此用例中没有真正的理由使用define()
。
在构建时注入您将要在另一个类中使用的对象绝对是正确的方法。还有方法注入,但在这一点上,它只是一个偏好问题。
换句话说,你不想在类中实例化一个新对象;您应该在其他地方创建它并将其注入。这样可以更好地解耦代码,并提高可维护性,因为您可以轻松,轻松地交换大部分应用程序。
在我看来,最好的办法就是:
class User
{
/** @var PDO */
private $pdo;
...
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
...
}
$pdo = new PDO(...);
$user = new User($pdo);
PDO
方法中的__construct()
是该方法将接受的对象类型的类型提示,而/** @var PDO */
是不必要的,但有助于IDE(和阅读代码的人)了解一旦设置了属性应该是什么。