【问题标题】:When passing an object to a class' method, does it need to be *defined* as a constant?将对象传递给类的方法时,是否需要*定义*为常量?
【发布时间】:2016-08-05 07:30:52
【问题描述】:

我的意思是我需要使用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 manual 中提到的对象属性,它声明初始化必须是常量,以便可以在编译时对其进行评估。

读了几遍之后,我用哪种方式都没有关系,因为它不会在类定义中被实例化。

如果我理解正确,手册所指的情况是在类定义中定义对象,而不是将值传递给属性。

我目前在使用 PDO 对象时将它们传递给每个函数,因此我想尝试在构造时传递它一次。或者,这是个坏主意吗?

我不确定这样做是否有任何好处,我只是想更好地理解 OOP。

【问题讨论】:

  • 如果您使用的是 PHP 的非死版本,它是通过引用传递的,第一个选项会起作用。但是,第二个版本不起作用,因为您的构造仍然需要一个变量......但更重要的是,因为您不能将类定义为常量。传入构造函数称为依赖注入,是一种非常常见的方法。 ^^
  • @Jon 抱歉,我错过了删除 getByUserName 方法。它已修复。
  • 嗯,好的。但是,您仍然不能将常量分配为类。该代码应该在define(MYPDO, new PDO(...)); 失败

标签: php class object properties


【解决方案1】:

在这个用例中没有真正的理由使用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(以及阅读您代码的人)了解设置后您的属性应该是什么。

【讨论】:

  • 谢谢。我想我正确地理解了这种做法。我使用的是我的第一种方法,但我认为我误解了手册的内容,因为他们使用了“常量”这个词。我以为我做错了。
  • 听起来你做得对,我很高兴听到!人们通常需要很长时间才能弄清楚依赖注入,所以这很棒。尽管我确实建议您在传入时使用类型提示对象。
  • 你刚刚给了我一些新的东西,谢谢。现在我想知道如果我将我的 User 对象注入另一个对象,并更改一个属性值,它会反映在另一个对象对它的使用中吗?
  • @Dexter 是的,会的。
  • @Dexter 为清楚起见,PHP 中的对象始终通过引用传递,而不是字符串或数组,您需要在函数的参数中将其定义为 &$myReferencedArray
猜你喜欢
  • 2023-03-04
  • 2017-12-25
  • 1970-01-01
  • 2023-04-01
  • 2015-09-24
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多