将对象传递给类'方法时,是否需要将*定义为*作为常量?

时间:2016-04-13 23:34:26

标签: php class object properties

我的意思是我需要使用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。

1 个答案:

答案 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(和阅读代码的人)了解一旦设置了属性应该是什么。