gpt4 book ai didi

design-patterns - 原则 2 中的代理人是什么?

转载 作者:行者123 更新时间:2023-12-03 04:41:01 24 4
gpt4 key购买 nike

我刚刚读完所有 Doctrine 2 文档,我开始了自己的沙箱,我理解了大部分原理,但仍然有一个问题,我在文档中找不到任何完整的解释。

  1. 什么是Proxy类?
  2. 什么时候应该在实体上使用它们?

据我了解,代理类添加了一个层,让您可以向实体添加一些其他功能,但为什么要使用代理而不是在实体类中实现方法本身?

最佳答案

UPDATE

This answer contains wrong information about differences between proxy objects and partial objects. See @Kontrollfreak's answer for more details: https://stackoverflow.com/a/17787070/252591

<小时/>

每当您的查询未返回创建实体所需的所有数据时,就会使用代理对象。想象一下以下场景:

@Entity
class User {
@Column protected $id;
@Column protected $username;
@Column protected $firstname;
@Column protected $lastname;

// bunch of setters/getters here
}

DQL query:

SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id

如您所见,此查询不会返回 firstnamelastname 属性,因此您无法创建 User 对象。创建不完整的实体可能会导致意外错误。

这就是为什么 Doctrine 将创建支持延迟加载的 UserProxy 对象。当您尝试访问 firstname 属性(未加载)时,它将首先从数据库加载该值。

<小时/>

I mean why should I use a proxy ?

您应该始终像根本不使用代理对象一样编写代码。它们可以被视为 Doctrine 使用的内部对象。

Why the lazy loading can't be implemented in the Entitiy itself?

从技术上讲,它可能是,但看看一些随机代理对象的类。它充满了肮脏的代码,呃。在您的实体中拥有干净的代码真是太好了。

Can you provide me an use case?

您正在显示最新 25 篇文章的列表,并且想要显示第一篇文章的详细信息。每个数据都包含大量文本,因此获取所有数据会浪费内存。这就是为什么您不会获取不必要的数据。

SELECT a.title, a.createdAt
FROM Entity\Article a
ORDER BY a.createdAt DESC
LIMIT 25

$isFirst = true;
foreach ($articles as $article) {
echo $article->getTitle();
echo $article->getCreatedAt();

if ($isFirst) {
echo $article->getContent(); // Article::content is not loaded so it is transparently loaded
// for this single article.

$isFirst = false;
}
}

关于design-patterns - 原则 2 中的代理人是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com