一、属性钩子(Property Hooks)
属性钩子(Property Hooks)是PHP8.4的一个新特性,允许我们在定义非静态属性时设置钩子函数,完成自定义功能逻辑。目前可以用的钩子有两个:set和get,分别对应在设置属性、访问属性这两个行为动作。
属性钩子的主要特性
- 只允许定义在非静态属性上;
- 两个钩子:get和set,分别对应在设置属性、访问属性这两个行为动作;
- 钩子的形式可以是:set=>...、set{}、set($value){} 三种表达式,如果是简单的表达式,可以直接使用箭头表达式即可。
属性钩子的基本用法
<?php
class people
{
public string $name = 'lisi' {
get => $this->name. ' get';
set => $this->name = 'lisi set';
}
}
$people = new people();
echo '获取到的名字:' . $people->name . PHP_EOL;
$people->name = 'zhangsan';
echo '修改后的名字:' . $people->name . PHP_EOL;
输出结果
获取到的名字:lisi get
修改后的名字:lisi set get
另外的用法
<?php
class people
{
public string $name = 'lisi' {
get {
return $this->name. ' get';
}
set(string $value){
$this->name = $value;
}
}
}
$people = new people();
echo '获取到的名字:' . $people->name . PHP_EOL;
$people->name = 'zhangsan';
echo '修改后的名字:' . $people->name . PHP_EOL;
输出结果
获取到的名字:lisi get
修改后的名字:zhangsan get
二、惰性对象(Lazy Objects)
什么是惰性对象
惰性对象是其初始化被推迟到它被访问或者修改的时候才会触发,它依靠反射的惰性实例去实现。在日常的项目中,利用它的这一特性可以提高资源的利用率。在依赖注入框架中,可以显著减少不必要的对象初始化,从而提高应用程序的性能。只有当依赖项被实际使用时,它们才会被初始化。
惰性对象的基本用法
<?php
class people
{
public string $name = 'zhangsan';
public function __construct()
{
echo "初始化方法被调用了" . PHP_EOL;
}
}
$reflect = new ReflectionClass('people');
//初始化的方法
$init = function (people $people) {
$people->__construct();
};
//创建惰性实例
$lazy_obj = $reflect->newLazyGhost($init);
var_dump($lazy_obj);
echo "================". PHP_EOL;
echo $lazy_obj->name . PHP_EOL;
输出结果
lazy ghost object(people)#3 (0) {
["name"]=>
uninitialized(string)
}
================
初始化方法被调用了
zhangsan
结论:创建惰性实例的时候,初始化方法并没有被执行,当访问它的name属性时也就是实际使用时才会调用初始化方法。
完结
如果你在阅读这篇文章时有所收获,请不要忘记点赞评论加关注,你的支持是我创作的最大动力。当然,如果你在文中发现了疏漏之处,或是有着其他的见解,欢迎私信与我交流。
我是老卢,一个热爱分享、不断探索的知识旅者。