PropertyAccess组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.1,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

PropertyAccess组件

PropertyAccess组件提供函数来读取和写入从/到一个对象使用一个简单的字符串或数组表示法。

安装

1
美元作曲家需要symfony /属性访欧宝娱乐app下载地址问

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

使用

这个组件的入口点createPropertyAccessor ()工厂。这家工厂将创建一个新的实例PropertyAccessor类的默认配置:

1 2 3
使用欧宝娱乐app下载地址\组件\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
/ /……美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >enableExceptionOnInvalidIndex ()- >getPropertyAccessor ();美元= (“first_name”= >“Wouter”,);/ /返回null,而是现在的代码会抛出异常的类型/ /欧宝娱乐app下载地址 Symfony \组件\ \ NoSuchIndexException PropertyAccess \异常美元价值=美元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]”));/ /“瑞恩”

阅读对象

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
/ /……{私人美元作者=真正的;私人美元孩子们= [];公共函数isAuthor(){返回美元- >作者;}公共函数hasChildren(){返回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 (美元,“生日”);

魔法__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”));/ / […]

魔法__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 28 29
/ /……{私人美元孩子们= (“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 29 30
/ /……{私人美元孩子们= [];公共函数__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 ());/ / […]

写入数组属性

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]);打破;}}}}使用欧宝娱乐app下载地址\组件\PropertyInfo\\ReflectionExtractor;使用欧宝娱乐app下载地址\组件\PropertyAccess\PropertyAccessor;美元列表=PeopleList ();美元reflectionExtractor=ReflectionExtractor (,,(“加入”,“离开”]);美元propertyAccessor=PropertyAccessor (,,,真正的,美元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
/ /……美元propertyAccessorBuilder= PropertyAccess::createPropertyAccessorBuilder ();/ /使魔法__call美元propertyAccessorBuilder- >enableMagicCall ();/ /禁用魔法__call美元propertyAccessorBuilder- >disableMagicCall ();/ /检查如果启用了魔法__call处理美元propertyAccessorBuilder- >isMagicCallEnabled ();/ /真或假/ /最后得到配置属性访问器美元propertyAccessor=美元propertyAccessorBuilder- >getPropertyAccessor ();/ /或全部美元propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();

或者你可以将参数直接传递给构造函数(不推荐):

1 2
/ /……美元propertyAccessor=PropertyAccessor (真正的);/ /这使魔法__call的处理
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。