回顾延迟加载在PHP代理
在Syob娱乐下载mfony 6.2中,VarExporter组件将船两个新的特征,帮助实现延迟加载对象。
正如他们的名字表明,延迟加载对象初始化只有当实际需要;通常当访问他们的一个属性。他们重来实例化对象时使用的,但并不总是使用。
主要有两种用例lazy-objects:懒惰的服务和懒惰的实体。
你可以找到懒惰的服务如Symfony依赖项注入容器。ob娱乐下载这是一段节选的文档欧宝官网下载app:
想象你有一个
欧宝平台是合法的吗NewsletterManager
你注射梅勒
服务。对你只有几个方法欧宝平台是合法的吗NewsletterManager
实际使用梅勒
,但即使你不需要它,梅勒
服务总是为了构建你的实例化欧宝平台是合法的吗NewsletterManager
。通过它懒惰,
梅勒
服务不会被初始化,除非欧宝平台是合法的吗NewsletterManager
发送一个电子邮件。- 你可以找到懒实体如。教义ORM他们用来创建没有填充的实体和集合。只有当首次访问的属性将延迟初始化检索他们的国家通过SQL查询。
如果你已经了解这个概念,你肯定知道ocramius /代理管理器图书馆。虽然教义ORM使用自己的实现,这个库是事实上的实施延迟加载在PHP代理。包装我们已经使用Symfony的容器ob娱乐下载自2013年以来的引入ob娱乐下载symfony / proxy-manager-bridge。其作者的巨大荣誉,工作在许多方面都会令人印象深刻的和鼓舞人心的。
不幸的是,1.5年前,由于维护之间的不兼容性Symfony的政策ob娱乐下载和维护ProxyManager政策,我们决定维持一个叉,您可能已经使用:friendsofphp / proxy-manager-lts。这个叉保持同步与原来的图书馆,但修补:
- 支持广泛的PHP和作曲家版本,
- 修复一些行为习惯需要猴子补丁的
proxy-manager-bridge
在未初始化的实例(例如,跳过析构函数或兼容的api), - 并支持新的PHP版本(到目前为止,
ProxyManager
不支持PHP 8.1,但我们需要这个版本在Symfony 6.1。)ob娱乐下载
别误会我,我在这里描述的问题是由我们使用这段代码,不通过原点。动态开源意味着作者欠任何的用户代码。这也意味着回馈可能想要的。这就是我们的原因寄回所有更改,合情合理。
但这种情况并不理想,因为它创造了摩擦和沮丧。
修复这是# 1的原因我写前面提到的两个特点。
理由2是一个技术一年以来,在我的脑海里:“我们可以取代生成的代码通过ProxyManager几个通用的特征吗?“你已经找到了,我找到了你,答案是“是的!”。这是巨大的,因为它意味着我们可以延迟加载实现的复杂性成几个文件,很容易被审计。
所以我们就在这儿了。让我给你介绍LazyGhostTrait
和LazyProxyTrait
。
通过使用LazyGhostTrait
,你可以给一个类添加延迟加载功能。这是通过创建空的实例(复位所有属性),通过计算他们的国家只有当访问一个属性,直接或间接(通过调用一个方法)。这是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
类FooLazyGhost扩展喷火{使用LazyGhostTrait;私人int美元lazyObjectId;}美元喷火= FooLazyGhost::createLazyGhost(初始化:函数(Foo美元实例):无效{/ / […你需要在这里)使用任何重逻辑/ /计算美元依赖美元的实例美元实例- >__construct (…美元依赖关系);/ / […如果需要]调用setter方法等});/ / foo美元现在是一个延迟加载鬼对象。初始化器将/ /被称为只有当如果一个* *访问属性。
你也可以部分初始化对象property-by-property基础上通过添加两个参数初始化:
1 2 3 4 5 6
美元初始化器=函数(Foo美元实例、字符串美元propertyName字符串,?美元propertyScope):混合{如果(Foo::类= = =美元propertyScope& &“酒吧”= = =美元propertyName){返回123年;}/ / […其他属性)添加更多的逻辑};
另外,LazyProxyTrait
可用于创建虚拟代理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元proxyCode= ProxyHelper::generateLazyProxy (新ReflectionClass (Foo::类));/ /美元proxyCode LazyProxyTrait包含引用/ /,应该在生产env转储到文件eval(“阶级FooLazyProxy”。美元proxyCode);美元喷火= FooLazyProxy::createLazyProxy(初始化:函数():喷火{/ / […你需要在这里)使用任何重逻辑/ /计算美元依赖美元的实例美元实例=新Foo (…美元依赖关系);/ / […如果需要]调用setter方法等返回美元实例;});/ / foo美元现在是一个延迟加载虚拟代理对象。初始化器将/ /被称为只有当如果一个* *称为方法。
您可能注意到,这段代码使用ProxyHelper
类来生成一些样板。这个代码生成是完全可选的可以直接决定使用特征。我已经这样做了这个公关船一个延迟加载复述,
类的缓存组件。
鬼只能用混凝土和non-internal类对象。在一般情况下,他们不兼容的使用工厂初始化。
虚拟代理使用具体、抽象或内部类。他们提供了一个API看起来像实际的对象和调用转发给他们。他们会导致身份问题,因为代理不可能被视为等价物的实际对象代理。
在这个身份的话题,LazyProxyTrait
只能够代理吗属性的一个实现。因此,当一个方法返回这个美元;
(或克隆这个美元
),这个美元
在问题是代理本身,而不是装修实例。这意味着流利和枯萎api工作的很好!(由于性能原因和内部类,装饰方法仍然可以生成。)
抛出的异常ProxyHelper
类可以帮助决定哪些特征与一个特定的类效果最好。
鬼对象和虚拟代理提供的实现LazyObjectInterface
它允许他们重置为其初始状态或在需要的时候强制初始化它们。注意,重置一个鬼魂对象跳过其只读属性。您应该使用一个虚拟代理重新设置只读属性。
DependencyInjection组件将在Symfony 6.2开始使用这些特征。ob娱乐下载请试一试,如果你发现任何问题汇报当然!
了解更多关于这个工作的信息,检查这些PRs:
享受吧!
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。