PropertyAccess组件

编辑该页面

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

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

PropertyAccess组件

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

安装

你可以安装组件在两种不同的方式:

然后,需要供应商/ autoload.php文件,使作曲家提供的半自动的机制。否则,您的应用程序无法找到这个Symfony组件的类。欧宝娱乐app下载地址

使用

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

1 2 3
使用欧宝娱乐app下载地址\组件\PropertyAccess\PropertyAccess;美元访问器= PropertyAccess::createPropertyAccessor ();

读取数组

你可以阅读的数组PropertyAccessor: getValue方法。这是通过使用索引在PHP中使用的符号:

1 2 3 4 5 6 7
/ /……美元=数组(“first_name”= >“Wouter”,);var_dump (美元访问器- >getValue (美元,“[first_name]”));/ /“Wouter”var_dump (美元访问器- >getValue (美元,“[时代]”));/ /空

正如您可以看到的,该方法将返回如果索引不存在。

您还可以使用多维数组:

1 2 3 4 5 6 7 8 9 10 11 12
/ /……美元=数组(数组(“first_name”= >“Wouter”),数组(“first_name”= >“瑞恩”));var_dump (美元访问器- >getValue (美元,“[0][first_name]”));/ /“Wouter”var_dump (美元访问器- >getValue (美元,“[1][first_name]”));/ /“瑞恩”

阅读对象

getValue ()方法是一个非常健壮的方法,你可以看到它的所有功能在处理对象。

访问公共属性

读取属性,使用“点”符号:

1 2 3 4 5 6 7 8 9 10 11
/ /……美元=人();美元- >firstName =“Wouter”;var_dump (美元访问器- >getValue (美元,“firstName”));/ /“Wouter”美元孩子=人();美元孩子- >firstName =“酒吧”;美元- >孩子=数组(美元孩子);var_dump (美元访问器- >getValue (美元,的孩子[0].firstName”));/ / '酒吧'

谨慎

访问使用的公共属性是最后的选择PropertyAccessor。它试图访问下面的值使用方法之前,首先直接使用属性。例如,如果你有一个公共的属性的getter方法,它将使用getter。

使用getter

getValue ()使用getter方法还支持阅读。该方法将使用常见的命名约定来创建getter。它camelizes属性名(first_name就变成了FirstName)和前缀得到。所以实际的方法getFirstName ():

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /……{私人美元firstName=“Wouter”;公共函数getFirstName(){返回美元- >firstName;}}美元=人();var_dump (美元访问器- >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 (美元- >儿童);}}美元=人();如果(美元访问器- >getValue (美元,“作者”)){var_dump (他是一个作家的);}如果(美元访问器- >getValue (美元,“孩子”)){var_dump (“他有孩子”);}

这将会产生:他是一个作家

魔法__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 (美元访问器- >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]:;美元- >孩子(美元财产]=美元价值;}}}美元=人();/ /启用魔法__call美元访问器= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();var_dump (美元访问器- >getValue (美元,“wouter”));/ /数组(…)

谨慎

__call ()功能被禁用默认情况下,您可以通过调用启用它PropertyAccessorBuilder: enableMagicCall看到使其他特性

写入数组

PropertyAccessor类可以做的不仅仅是读一个数组,数组也可以写。这可以通过使用PropertyAccessor:: setValue方法:

1 2 3 4 5 6 7 8
/ /……美元=数组();美元访问器- >setValue (美元,“[first_name]”,“Wouter”);var_dump (美元访问器- >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
/ /……{公共美元firstName;私人美元;私人美元孩子们=数组();公共函数setLastName(美元的名字){美元- >lastName =美元的名字;}公共函数__set(美元财产,美元价值){美元- >美元属性=美元价值;}/ /……}美元=人();美元访问器- >setValue (美元,“firstName”,“Wouter”);美元访问器- >setValue (美元,“姓”,”德容);美元访问器- >setValue (美元,“孩子”,数组(人()));var_dump (美元- >firstName);/ /“Wouter”var_dump (美元- >getLastName ());/ /“德容”var_dump (美元- >儿童);/ /数组(人());

您还可以使用__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美元访问器= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();美元访问器- >setValue (美元,“wouter”,数组(…));var_dump (美元- >getWouter ());/ /数组(…)

检查属性的路径

当你想要检查是否PropertyAccessor: getValue可以安全地调用不调用这个方法,您可以使用吗PropertyAccessor: isReadable而不是:

1 2 3 4 5
美元=人();如果(美元访问器- >isReadable (美元,“firstName”)){/ /……}

相同的是可能的PropertyAccessor:: setValue:电话PropertyAccessor: isWritable方法找出一个属性路径是否可以更新:

1 2 3 4 5
美元=人();如果(美元访问器- >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(){返回美元- >孩子;}}美元=人();美元访问器- >setValue (美元,“孩子[0]”,人);/ / = $人- >调用getChildren()[0] =新人()美元访问器- >setValue (美元,的孩子[0].firstName”,“Wouter”);/ / = $人- >调用getChildren () [0] - > firstName =“Wouter”var_dump (“你好”美元访问器- >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
/ /……美元accessorBuilder= PropertyAccess::createPropertyAccessorBuilder ();/ /启用魔法__call美元accessorBuilder- >enableMagicCall ();/ /禁用魔法__call美元accessorBuilder- >disableMagicCall ();/ /检查是否启用魔法__call处理美元accessorBuilder- >isMagicCallEnabled ();/ /真或假/ /最后得到配置属性访问器美元访问器=美元accessorBuilder- >getPropertyAccessor ();/ /或全部美元访问器= PropertyAccess::createPropertyAccessorBuilder ()- >enableMagicCall ()- >getPropertyAccessor ();

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

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