当将对象传递给类';方法,是否需要将其*定义为常量


When passing an object to a class' method, does it need to be *defined* as a constant?

我的意思是,在将对象传递给类的方法之前,我需要使用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(以及阅读代码的人员)了解设置后您的属性应该是什么。