propertyaccess组件

propertyaccess组件

PropertyAccess组件提供了使用简单字符串表示法从对象或数组读写的函数。

安装

1
$作曲家需要Symfony / Pr欧宝娱乐app下载地址operty-Access

笔记

如果在Symfony应用程序之外安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php.以启用Composer提供的类自动加载机制。读这篇文章更多细节。

用法

该组件的入口点是createPropertyAccessor()工厂。的新实例欧宝娱乐app下载地址symfony \ component \ propertyaccess \ propertyAccessor类具有默认配置:

欧宝娱乐app下载地址Symfony \ \ PropertyAccess \ PropertyAccess组件;propertyAccessor美元=PropertyAccess::createPropertyAccessor.();

从阵列阅读

您可以读取一个数组getValue ()方法。这是使用PHP中使用的索引表示法完成的:

/ /……$人=['名'=>'wouter'];var_dump.propertyAccessor美元- >getValue$人“[first_name]”));/ /“Wouter”var_dump.propertyAccessor美元- >getValue$人“[时代]”));/ /空

如您所见,该方法将返回空值如果索引不存在。但是你可以用这个行为改变这个行为EnableExceptionOnInValidIndex()方法:

/ /……propertyAccessor美元=PropertyAccess::CreatePropertyAccessorbuilder.()- >enable ipiononinvalidIndex.()- >getPropertyAccessor();$人=['名'=>'wouter'];//代码现在抛出一个类型异常,而不是返回null// 欧宝娱乐app下载地址symfony \ component \ propertyAccess \异常\ nosuchindexexception美元的价值=propertyAccessor美元- >getValue$人“[时代]”);

你也可以使用多维数组:

/ /……$人员=[['名'=>'wouter'],['名'=>'ryan']];var_dump.propertyAccessor美元- >getValue$人员'[0] [first_name]'));/ /“Wouter”var_dump.propertyAccessor美元- >getValue$人员'[1] [first_name]'));/ /“瑞恩”

阅读对象

getValue ()方法是一种非常强大的方法,您可以在使用对象时查看其所有功能。

访问公共属性

要从属性中读取,请使用“点”表示法:

/ /……$人=新的();$人- >firstName='wouter';var_dump.propertyAccessor美元- >getValue$人'名'));/ /“Wouter”$ child.=新的();$ child.- >firstName='酒吧';$人- >孩子们=[$ child.];var_dump.propertyAccessor美元- >getValue$人'孩子们[0] .Firstname'));// '酒吧'

谨慎

使用的最后一个选项是访问公共属性PropertyAccessor..它首先尝试使用下面的方法访问值,然后再直接使用属性。例如,如果您有一个具有getter方法的公共属性,它将使用getter。

使用getter

getValue ()方法还支持使用getter读取。将使用Getters的常见命名约定创建该方法。它将属性名称转换为CamelCase(成为FirstName)和前缀为得到.所以实际的方法变成getfirstname()

/ /……班级{私人的firstName美元='wouter';公共功能getfirstname.(){返回这个美元- >firstName;}}$人=新的();var_dump.propertyAccessor美元- >getValue$人'名'));/ /“Wouter”

使用Hassers / Issers

而且还不止于此。如果没有找到getter,访问器将寻找isser或hasser。这个方法是用与getter相同的方式创建的,这意味着你可以这样做:

/ /……班级{私人的$ author.=真的;私人的美元的孩子=[];公共功能isAuthor(){返回这个美元- >作者;}公共功能有孩子(){返回0.= = !数数这个美元- >孩子们);}}$人=新的();如果propertyAccessor美元- >getValue$人'作者'))){var_dump."这个人是作者");}如果propertyAccessor美元- >getValue$人'孩子们'))){var_dump.“这个人有孩子”);}

这将会产生:一个作者

访问不存在的属性路径

默认情况下一个欧宝娱乐app下载地址Symfony \组件\ \ NoSuchPropertyException PropertyAccess \异常如果属性路径传递给getValue ()不存在。您可以使用该行为disablepceptiononinvalidpropertypath()方法:

/ /……班级{公共美元的名字;}$人=新的();propertyAccessor美元=PropertyAccess::CreatePropertyAccessorbuilder.()- >disableExceptionOnInvalidPropertyPath()- >getPropertyAccessor();//而不是抛出异常,则以下代码返回null美元的价值=propertyAccessor美元- >getValue$人'生日');

魔法__get ()方法

getValue ()方法也可以使用魔法__get ()方法:

/ /……班级{私人的美元的孩子=['wouter'=>[...],];公共功能__得到$ ID{返回这个美元- >孩子们[$ ID];}}$人=新的();var_dump.propertyAccessor美元- >getValue$人'wouter'));// [...]

5.2新版功能:魔法__get ()方法可以在Symfony 5.2中禁用。欧宝娱乐app下载地址看使其他特性

魔法__call ()方法

最后,getValue ()可以使用魔法__call ()方法,但您需要通过使用启用此功能欧宝娱乐app下载地址symfony \ component \ propertyaccess \ propertyAccessorbuilder

/ /……班级{私人的美元的孩子=[“wouter”=>[...],];公共功能__称呼美元的名字$ args.{美元的财产=LCFirst.Substr.美元的名字3.));如果“得到”===.Substr.美元的名字0.3.))){返回这个美元- >孩子们[美元的财产]??空值;}elseif“设置”===.Substr.美元的名字0.3.))){美元的价值=1==数数$ args.$ args.[0.]空值;这个美元- >孩子们[美元的财产]=美元的价值;}}}$人=新的();//启用PHP __call()魔术方法propertyAccessor美元=PropertyAccess::CreatePropertyAccessorbuilder.()- >EnableMagicCall.()- >getPropertyAccessor();var_dump.propertyAccessor美元- >getValue$人“wouter”));// [...]

谨慎

__call ()默认情况下禁用功能,您可以通过调用来启用它EnableMagicCall()使其他特性

写入数组

PropertyAccessor.类可以做的不仅仅是读取数组,它也可以写入数组。这可以使用它来实现设定值()方法:

/ /……$人=[];propertyAccessor美元- >设定值$人“[first_name]”'wouter');var_dump.propertyAccessor美元- >getValue$人“[first_name]”));/ /“Wouter”/ /或/ / var_dump($人[' first_name ']);/ /“Wouter”

写给对象

设定值()方法具有与getValue ()方法。你可以使用setter__set ()方法或属性来设置值:

/ /……班级{公共firstName美元;私人的$ lastname.;私人的美元的孩子=[];公共功能setLastName美元的名字{这个美元- >=美元的名字;}公共功能getLastName(){返回这个美元- >;}公共功能getchildren.(){返回这个美元- >孩子们;}公共功能__放美元的财产美元的价值{这个美元- >美元的财产=美元的价值;}}$人=新的();propertyAccessor美元- >设定值$人'名''wouter');propertyAccessor美元- >设定值$人“姓””德容);//调用setLastNamepropertyAccessor美元- >设定值$人'孩子们'[新的()));//调用__setvar_dump.$人- >firstName);/ /“Wouter”var_dump.$人- >getLastName());//'dejong'var_dump.$人- >getchildren.());// [人()];

你也可以使用__call ()要设置值,但您需要启用该功能,请参阅使其他特性

/ /……班级{私人的美元的孩子=[];公共功能__称呼美元的名字$ args.{美元的财产=LCFirst.Substr.美元的名字3.));如果“得到”===.Substr.美元的名字0.3.))){返回这个美元- >孩子们[美元的财产]??空值;}elseif“设置”===.Substr.美元的名字0.3.))){美元的价值=1==数数$ args.$ args.[0.]空值;这个美元- >孩子们[美元的财产]=美元的价值;}}}$人=新的();//启用magic __callpropertyAccessor美元=PropertyAccess::CreatePropertyAccessorbuilder.()- >EnableMagicCall.()- >getPropertyAccessor();propertyAccessor美元- >设定值$人“wouter”[...]);var_dump.$人- >getWouter());// [...]

5.2新版功能:魔法__set ()方法可以在Symfony 5.2中禁用。欧宝娱乐app下载地址看使其他特性

写入数组属性

PropertyAccessor.类允许通过更新存储在属性中的数组内容加法器去除剂方法:

/ /……班级{/ *** @var string []* /私人的美元的孩子=[];公共功能getchildren.()数组{返回这个美元- >孩子们;}公共功能addchild.字符串美元的名字空白{这个美元- >孩子们[美元的名字]=美元的名字;}公共功能Removechild.字符串美元的名字空白{解开这个美元- >孩子们[美元的名字]);}}$人=新的();propertyAccessor美元- >设定值$人'孩子们'['凯文'“wouter”]);var_dump.$人- >getchildren.());// ['kevin','wouter']

PropertyAccess组件检查调用的方法添加()删除().两个方法都必须定义。例如,在前面的示例中,组件查找addchild()作用是:进入的方法孩子们财产。偏转器组件用于查找属性名的单数形式。

如果可供使用的话,加法器去除剂方法的优先级高于setter方法。

使用非标准加法器/卸妆方法

有时,加法器和移除器方法不使用标准添加或者去掉前缀,就像在这个例子中:

/ /……班级Peoplelist.{/ /……公共功能加入人们字符串美元的人空白{这个美元- >人们[]=美元的人;}公共功能leavePeople字符串美元的人空白{Foreach.这个美元- >人们作为$ ID=>美元的项目{如果美元的人===.美元的项目{解开这个美元- >人们[$ ID]);休息;}}}}欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor;欧宝娱乐app下载地址symfony \ component \ propertyaccess \ propertyAccessor;$列表=新的Peoplelist.();$反射伸缩器=新的反射呼吸反射器空值空值['加入''离开']);propertyAccessor美元=新的PropertyAccessor.PropertyAccessor.::disallow_magic_methods.错误的空值真的$反射伸缩器$反射伸缩器);propertyAccessor美元- >设定值$人'人们'['凯文'“wouter”]);var_dump.$人- >getPeoples());// ['kevin','wouter']

而不是打电话添加()删除(),PropertyAccess组件将调用加入< SingularOfThePropertyName > ()离开()方法。

检查物业路径

当您想要检查是否getValue ()可以安全地调用而不实际调用该方法吗isReadable ()反而:

$人=新的();如果propertyAccessor美元- >isReadable$人'名'))){/ /……}

也是如此设定值():电话iswrity()方法要了解属性路径是否可以更新:

$人=新的();如果propertyAccessor美元- >itflity.$人'名'))){/ /……}

混合物体和数组

您还可以混合对象和数组:

/ /……班级{公共firstName美元;私人的美元的孩子=[];公共功能setchildren.美元的孩子{这个美元- >孩子们=美元的孩子;}公共功能getchildren.(){返回这个美元- >孩子们;}}$人=新的();propertyAccessor美元- >设定值$人“孩子们[0]'新的);$person->getChildren()[0] = new person ()propertyAccessor美元- >设定值$人'孩子们[0] .Firstname''wouter');//等于$ person-> getchildren()[0]  - > firstname ='wouter'var_dump.'你好 'propertyAccessor美元- >getValue$人'孩子们[0] .Firstname'));/ /“Wouter”//等于$ person-> getchildren()[0]  - >名字

使其他特性

欧宝娱乐app下载地址symfony \ component \ propertyaccess \ propertyAccessor可以配置为实现额外的功能。要做,你可以使用欧宝娱乐app下载地址symfony \ component \ propertyaccess \ propertyAccessorbuilder

/ /……propertyAccessorBuilder美元=PropertyAccess::CreatePropertyAccessorbuilder.();propertyAccessorBuilder美元- >EnableMagicCall.();//启用魔法__callpropertyAccessorBuilder美元- >EnableMagicget.();//启用魔术_GetpropertyAccessorBuilder美元- >enableMagicSet();//启用魔法__setpropertyAccessorBuilder美元- >enableMagicMethods();//启用__get, __set和__callpropertyAccessorBuilder美元- >disablemagiccall.();//禁用魔术__callpropertyAccessorBuilder美元- >disableMagicGet();//禁用魔法__getpropertyAccessorBuilder美元- >disablemagicset.();//禁用magic __setpropertyAccessorBuilder美元- >disablemagicmethods.();//禁用魔术__get,__set和__call//检查魔术__call,__get或__set处理是否已启用propertyAccessorBuilder美元- >ISMagicCallEnabled.();// 对或错propertyAccessorBuilder美元- >isMagicGetEnabled();// 对或错propertyAccessorBuilder美元- >isMagicSetEnabled();// 对或错//最后获取配置的属性访问器propertyAccessor美元=propertyAccessorBuilder美元- >getPropertyAccessor();//或者all in onepropertyAccessor美元=PropertyAccess::CreatePropertyAccessorbuilder.()- >EnableMagicCall.()- >getPropertyAccessor();

或者您可以将参数直接传递给构造函数(不是推荐的方式):

//启用__set,而不是__get:propertyAccessor美元=新的PropertyAccessor.PropertyAccessor.::Magic_Call.|PropertyAccessor.::MAGIC_SET);

这项工作,包括代码样本,是在一个Creative Commons by-SA 3.0执照。