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