PropertyAccess组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.0,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

PropertyAccess组件

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

安装

您可以通过两种不同的方式安装组件:

然后,要求供应商/ autoload.php文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。欧宝娱乐app下载地址

使用

该组件的入口点是PropertyAccess: createPropertyAccessor工厂。类的新实例PropertyAccessor使用默认配置初始化:

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

从数组读取

属性可以读取数组PropertyAccessor: getValue方法。这是使用PHP中使用的索引符号完成的:

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

如您所见,该方法将返回如果索引不存在。

你也可以使用多维数组:

12 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的通用命名约定创建。它修饰了属性名(first_name就变成了FirstName),并以得到.所以实际的方法是getFirstName:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ /……私人firstName“Wouter”公共函数getFirstName()返回->firstName;}}人();var_dump (访问器->getValue (“first_name”));/ /“Wouter”

使用Hassers /伊塞

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

12 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方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……私人孩子们数组“Wouter”= >数组(…),);公共函数__getid返回->孩子(id];}}人();var_dump (访问器->getValue (“Wouter”));/ /数组(…)

魔法__call ()方法

最后,getValue可以使用魔法__call方法,但您需要使用PropertyAccessorBuilder:

12 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 (的名字03.)) {返回收取->孩子(财产]) ?->孩子(财产]:;}elseif“设置”= = = substr (的名字03.)) {价值1= = count (arg游戏) ?arg游戏0]:->孩子(财产] =价值;}}}人();//启用magic __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方法或属性来设置值:

12 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 ());// 'de Jong'var_dump (->儿童);/ /数组(人());

你也可以使用__call若要设置值,但需要启用该特性,请参见启用其他特性

12 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 (的名字03.)) {返回收取->孩子(财产]) ?->孩子(财产]:;}elseif“设置”= = = substr (的名字03.)) {价值1= = count (arg游戏) ?arg游戏0]:->孩子(财产] =价值;}}}人();//启用magic __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”)) {/ /……

混合对象和数组

你也可以混合使用对象和数组:

12 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] = new person ()访问器->setValue (的孩子[0].firstName”“Wouter”);// = $person->getChildren()[0]->firstName = 'Wouter'var_dump (“你好”访问器->getValue (的孩子[0].firstName”));/ /“Wouter”//等于$person->getChildren()[0]->firstName

启用其他特性

PropertyAccessor可以配置为启用额外的功能。要做到这一点,你可以使用PropertyAccessorBuilder:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ /……accessorBuilder= PropertyAccess::createPropertyAccessorBuilder ();//启用magic __callaccessorBuilder->enableMagicCall ();//禁用magic __callaccessorBuilder->disableMagicCall ();//检查是否启用了magic __call处理accessorBuilder->isMagicCallEnabled ();// true或false//在最后获得配置的属性访问器访问器accessorBuilder->getPropertyAccessor ();//或全部合一访问器= PropertyAccess::createPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();

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

1 2
/ /……访问器PropertyAccessor (真正的);//这样就可以处理magic __call
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。