PropertyAccess组件
编辑该页面PropertyAccess组件
PropertyAccess组件提供的功能从/读取和写入到一个对象使用一个简单的字符串或数组表示法。
安装
1
美元作曲家需要symfony /属性访ob娱乐下载问
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
使用
这个组件的入口点createPropertyAccessor ()工厂。这家工厂将创建一个新的实例PropertyAccessor类的默认配置:
1 2 3
使用ob娱乐下载\组件\PropertyAccess\PropertyAccess;美元propertyAccessor= PropertyAccess::createPropertyAccessor ();
读取数组
你可以阅读的数组getValue ()方法。这是通过使用索引在PHP中使用的符号:
1 2 3 4 5 6 7
/ /……美元人= (“first_name”= >“Wouter”,);var_dump (美元propertyAccessor- >getValue (美元人,“[first_name]”));/ /“Wouter”var_dump (美元propertyAccessor- >getValue (美元人,“[时代]”));/ /空
正如您可以看到的,该方法将返回零
如果索引不存在。但你可以改变这一行为enableExceptionOnInvalidIndex ()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >enableExceptionOnInvalidIndex ()- >getPropertyAccessor ();美元人= (“first_name”= >“Wouter”,);/ /返回null,而是现在的代码会抛出异常的类型/ /ob娱乐下载 Symfony \组件\ \ NoSuchIndexException PropertyAccess \异常美元价值=美元propertyAccessor- >getValue (美元人,“[时代]”);/ /可以避免例外通过添加nullsafe算子美元价值=美元propertyAccessor- >getValue (美元人,“(年龄?)”);
您还可以使用多维数组:
1 2 3 4 5 6 7 8 9 10 11 12
/ /……美元人= [[“first_name”= >“Wouter”),(“first_name”= >“瑞恩”]];var_dump (美元propertyAccessor- >getValue (美元人,“[0][first_name]”));/ /“Wouter”var_dump (美元propertyAccessor- >getValue (美元人,“[1][first_name]”));/ /“瑞恩”
提示
如果数组的键包含一个点。
或左方括号(
,你必须用一个反斜杠转义的字符。在上面的例子中,如果数组键first.name
而不是first_name
,你应该访问它的值如下:
1 2
var_dump (美元propertyAccessor- >getValue (美元人,“[0][第一\ . name]”));/ /“Wouter”var_dump (美元propertyAccessor- >getValue (美元人,”[1][第一\ . name]));/ /“瑞恩”
右方括号]
不需要数组键中逃脱。
6.3
点和左方括号中逃出来的路径是在Symfony 6.3中引入的一个属性。ob娱乐下载
阅读对象
的getValue ()
方法是一个非常健壮的方法,你可以看到它的所有功能在处理对象。
访问公共属性
读取属性,使用“点”符号:
1 2 3 4 5 6 7 8 9 10 11
/ /……美元人=新人();美元人- >firstName =“Wouter”;var_dump (美元propertyAccessor- >getValue (美元人,“firstName”));/ /“Wouter”美元孩子=新人();美元孩子- >firstName =“酒吧”;美元人- >孩子= [美元孩子];var_dump (美元propertyAccessor- >getValue (美元人,的孩子[0].firstName”));/ / '酒吧'
谨慎
访问使用的公共属性是最后的选择PropertyAccessor
。它试图访问下面的值使用方法之前,首先直接使用属性。例如,如果你有一个公共的属性的getter方法,它将使用getter。
使用getter
的getValue ()
使用getter方法还支持阅读。该方法将使用常见的命名约定来创建getter。它将属性名camelCase (first_name
就变成了FirstName
)和前缀得到
。所以实际的方法getFirstName ()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /……类人{私人字符串美元firstName=“Wouter”;公共函数getFirstName():字符串{返回美元这- >firstName;}}美元人=新人();var_dump (美元propertyAccessor- >getValue (美元人,“first_name”));/ /“Wouter”
使用Hassers /伊塞
它甚至不停止。如果没有getter发现,访问器将寻找一个伊塞或拥有。该方法使用相同的方式创建getter,这意味着您可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
/ /……类人{私人bool美元作者=真正的;私人数组美元孩子们= [];公共函数isAuthor():bool{返回美元这- >作者;}公共函数hasChildren():bool{返回0! = = count (美元这- >儿童);}}美元人=新人();如果(美元propertyAccessor- >getValue (美元人,“作者”)){var_dump (这个人是一个作家);}如果(美元propertyAccessor- >getValue (美元人,“孩子”)){var_dump (“这个人有孩子”);}
这将会产生:这个人是一个作家
访问一个非现有财产的道路
默认情况下一个NoSuchPropertyException如果属性的路径传递给抛出getValue ()不存在。使用你可以改变这一行为disableExceptionOnInvalidPropertyPath ()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /……类人{公共字符串美元的名字;}美元人=新人();美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >disableExceptionOnInvalidPropertyPath ()- >getPropertyAccessor ();/ /抛出异常,而是下面的代码返回null美元价值=美元propertyAccessor- >getValue (美元人,“生日”);
访问Nullable属性路径
考虑下面的PHP代码:
1 2 3 4 5 6 7 8 9 10 11 12
类人{}类评论{公共人吗?美元人=零;公共字符串美元消息;}美元评论=新评论();美元评论- >消息=“测试”;
考虑到美元的人
是可空,一个对象图comment.person.profile
时将引发一个异常美元的人
属性是零
。解决方案是马克所有nullable属性与nullsafe操作符(吗?
):
1 2 3 4 5 6 7
/ /这段代码会抛出异常的类型/ /ob娱乐下载 Symfony \组件\ \ UnexpectedTypeException PropertyAccess \异常var_dump (美元propertyAccessor- >getValue (美元评论,“person.firstname”));/ /如果一个属性标注nullsafe操作符为空,表达式/ /不再评估没有抛出异常并立即返回nullvar_dump (美元propertyAccessor- >getValue (美元评论,“人? .firstname”));/ /空
6.2
的吗?
nullsafe操作符是在Symfony 6.2中引入的。ob娱乐下载
魔法__get ()
方法
的getValue ()
还可以使用魔法的方法__get ()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……类人{私人数组美元孩子们= (“Wouter”= > […]];公共函数__get(美元id):混合{返回美元这- >孩子(美元id];}}美元人=新人();var_dump (美元propertyAccessor- >getValue (美元人,“Wouter”));/ / […]
请注意
的__get ()
方法支持是默认启用的。看到使其他特性如果你想禁用它。
魔法__call ()
方法
最后,getValue ()
可以使用魔法__call ()
方法,但您需要启用这个特性通过使用PropertyAccessorBuilder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ /……类人{私人数组美元孩子们= (“wouter”= > […]];公共函数__call(美元的名字,美元arg游戏):混合{美元财产= lcfirst (substr (美元的名字,3));如果(“得到”= = = substr (美元的名字,0,3)){返回美元这- >孩子(美元财产)? ?零;}elseif(“设置”= = = substr (美元的名字,0,3)){美元价值=1= = count (美元arg游戏)?美元arg游戏(0]:零;美元这- >孩子(美元财产]=美元价值;}}}美元人=新人();/ /允许PHP __call()神奇的方法美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();var_dump (美元propertyAccessor- >getValue (美元人,“wouter”));/ / […]
谨慎
的__call ()
功能被禁用默认情况下,您可以通过调用启用它enableMagicCall ()看到使其他特性。
写入数组
的PropertyAccessor
类可以做的不仅仅是读一个数组,数组也可以写。这可以通过使用setValue ()方法:
1 2 3 4 5 6 7 8
/ /……美元人= [];美元propertyAccessor- >setValue (美元人,“[first_name]”,“Wouter”);var_dump (美元propertyAccessor- >getValue (美元人,“[first_name]”));/ /“Wouter”/ /或/ / var_dump($人[' first_name ']);/ /“Wouter”
写作对象
的setValue ()
方法有相同的特性getValue ()
方法。您可以使用setter,魔法__set ()
方法或属性设置值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37
/ /……类人{公共字符串美元firstName;私人字符串美元姓;私人数组美元孩子们= [];公共函数setLastName(美元的名字):无效{美元这- >lastName =美元的名字;}公共函数getLastName():字符串{返回美元这- >姓;}公共函数调用getChildren():数组{返回美元这- >孩子;}公共函数__set(美元财产,美元价值):无效{美元这- >美元属性=美元价值;}}美元人=新人();美元propertyAccessor- >setValue (美元人,“firstName”,“Wouter”);美元propertyAccessor- >setValue (美元人,“姓”,”德容);/ /调用setLastName美元propertyAccessor- >setValue (美元人,“孩子”,(新人()));/ /调用__setvar_dump (美元人- >firstName);/ /“Wouter”var_dump (美元人- >getLastName ());/ /“德容”var_dump (美元人- >调用getChildren ());/ /(人());
您还可以使用__call ()
设置值,但你需要启用该功能,看看使其他特性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
/ /……类人{私人数组美元孩子们= [];公共函数__call(美元的名字,美元arg游戏):混合{美元财产= lcfirst (substr (美元的名字,3));如果(“得到”= = = substr (美元的名字,0,3)){返回美元这- >孩子(美元财产)? ?零;}elseif(“设置”= = = substr (美元的名字,0,3)){美元价值=1= = count (美元arg游戏)?美元arg游戏(0]:零;美元这- >孩子(美元财产]=美元价值;}}}美元人=新人();/ /启用魔法__call美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();美元propertyAccessor- >setValue (美元人,“wouter”,[…]);var_dump (美元人- >getWouter ());/ / […]
请注意
的__set ()
方法支持是默认启用的。看到使其他特性如果你想禁用它。
写入数组属性
的PropertyAccessor
类允许更新数组的内容存储在属性加法器和剂方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
/ /……类人{/ * * *@varstring [] * /私人数组美元孩子们= [];公共函数调用getChildren():数组{返回美元这- >孩子;}公共函数调用addChild(字符串美元的名字):无效{美元这- >孩子(美元的名字]=美元的名字;}公共函数removeChild(字符串美元的名字):无效{设置(美元这- >孩子(美元的名字]);}}美元人=新人();美元propertyAccessor- >setValue (美元人,“孩子”,(“凯文”,“wouter”]);var_dump (美元人- >调用getChildren ());/ /(“凯文”、“wouter”)
PropertyAccess组件检查方法调用添加< SingularOfThePropertyName > ()
和删除< SingularOfThePropertyName > ()
。这两种方法都必须定义。例如,在前面的例子中,组件查找addChild ()
和作用是:
方法来访问孩子们
财产。字符串组件弯曲物用于查找属性的奇异的名字。
如果可行的话,加法器和剂优先于一种方法setter方法。
使用非标准的加法器/剂方法
有时,加法器和剂不使用标准的方法添加
或删除
前缀,就像这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30
/ /……类PeopleList{/ /……公共函数joinPeople(字符串美元人):无效{美元这- >民[]=美元人;}公共函数leavePeople(字符串美元人):无效{foreach(美元这- >国人民作为美元id= >美元项){如果(美元人= = =美元项){设置(美元这- >民[美元id]);打破;}}}}使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;使用ob娱乐下载\组件\PropertyAccess\PropertyAccessor;美元列表=新PeopleList ();美元reflectionExtractor=新ReflectionExtractor (零,零,(“加入”,“离开”]);美元propertyAccessor=新PropertyAccessor (PropertyAccessor::DISALLOW_MAGIC_METHODS, PropertyAccessor::THROW_ON_INVALID_PROPERTY_PATH,零,美元reflectionExtractor,美元reflectionExtractor);美元propertyAccessor- >setValue (美元人,“人民”,(“凯文”,“wouter”]);var_dump (美元人- >getPeoples ());/ /(“凯文”、“wouter”)
而不是打电话添加< SingularOfThePropertyName > ()
和删除< SingularOfThePropertyName > ()
,PropertyAccess组件将电话加入< SingularOfThePropertyName > ()
和离开< SingularOfThePropertyName > ()
方法。
检查属性的路径
当你想要检查是否getValue ()可以安全地调用不调用这个方法,您可以使用吗isReadable ()而不是:
1 2 3 4 5
美元人=新人();如果(美元propertyAccessor- >isReadable (美元人,“firstName”)){/ /……}
相同的是可能的setValue ():电话isWritable ()方法找出一个属性路径是否可以更新:
1 2 3 4 5
美元人=新人();如果(美元propertyAccessor- >isWritable (美元人,“firstName”)){/ /……}
混合对象和数组
你也可以混合对象和数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ /……类人{公共字符串美元firstName;私人数组美元孩子们= [];公共函数setChildren(美元孩子们):无效{美元这- >孩子=美元孩子们;}公共函数调用getChildren():数组{返回美元这- >孩子;}}美元人=新人();美元propertyAccessor- >setValue (美元人,“孩子[0]”,新人);/ / = $人- >调用getChildren()[0] =新人()美元propertyAccessor- >setValue (美元人,的孩子[0].firstName”,“Wouter”);/ / = $人- >调用getChildren () [0] - > firstName =“Wouter”var_dump (“你好”。美元propertyAccessor- >getValue (美元人,的孩子[0].firstName”));/ /“Wouter”/ / = $人- >调用getChildren () [0] - > firstName
使其他特性
的PropertyAccessor可以配置为启用额外的特性。你可以使用PropertyAccessorBuilder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
/ /……美元propertyAccessorBuilder= PropertyAccess::createPropertyAccessorBuilder ();美元propertyAccessorBuilder- >enableMagicCall ();/ /使魔法__call美元propertyAccessorBuilder- >enableMagicGet ();/ /使魔法__get美元propertyAccessorBuilder- >enableMagicSet ();/ /使魔法__set美元propertyAccessorBuilder- >enableMagicMethods ();/ /使魔法__get __set __call美元propertyAccessorBuilder- >disableMagicCall ();/ /禁用魔法__call美元propertyAccessorBuilder- >disableMagicGet ();/ /禁用魔法__get美元propertyAccessorBuilder- >disableMagicSet ();/ /禁用魔法__set美元propertyAccessorBuilder- >disableMagicMethods ();/ /禁用魔法__get __set __call/ /检查魔法__call, __get或__set处理启用美元propertyAccessorBuilder- >isMagicCallEnabled ();/ /真或假美元propertyAccessorBuilder- >isMagicGetEnabled ();/ /真或假美元propertyAccessorBuilder- >isMagicSetEnabled ();/ /真或假/ /最后得到配置属性访问器美元propertyAccessor=美元propertyAccessorBuilder- >getPropertyAccessor ();/ /或全部美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();
或者你可以将参数直接传递给构造函数(不推荐):
1 2
/ /使处理的魔法__call __set但不是__get:美元propertyAccessor=新PropertyAccessor (PropertyAccessor::MAGIC_CALL | PropertyAccessor::MAGIC_SET);