PropertyAccess组件

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

PropertyAccess组件

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

安装

1
作曲家需要symfony/propob娱乐下载erty-access

请注意

如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

使用

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

1 2 3
使用ob娱乐下载组件PropertyAccessPropertyAccesspropertyAccessor= 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 ()方法:

12 3 4 5 6 7 8 9 10 11 12
/ /……propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()->enableExceptionOnInvalidIndex ()->getPropertyAccessor ();= (“first_name”=>“Wouter”,);//代码现在抛出类型异常,而不是返回null/ /ob娱乐下载 Symfony \组件\ \ NoSuchIndexException PropertyAccess \异常价值propertyAccessor->getValue (“[时代]”);

你也可以使用多维数组:

12 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 ()

12 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,访问器将寻找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 (->儿童);}}人();如果propertyAccessor->getValue (“作者”) {var_dump("这个人是个作家");}如果propertyAccessor->getValue (“孩子”) {var_dump(“这个人有孩子”);}

这将产生:这个人是作家

访问不存在的属性路径

默认为NoSuchPropertyException属性路径传递给getValue ()不存在。属性可以更改此行为disableExceptionOnInvalidPropertyPath ()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ /……公共的名字;}人();propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()->disableExceptionOnInvalidPropertyPath ()->getPropertyAccessor ();//下面的代码返回null而不是抛出异常价值propertyAccessor->getValue (“生日”);

魔法__get ()方法

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

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

5.2

神奇的__get ()方法可以在Symfony 5.2中禁用。ob娱乐下载看到启用其他特性

魔法__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
/ /……私人孩子们= (“wouter”= >[…]];公共函数__call的名字arg游戏财产= lcfirst (substr (的名字3.));如果“得到”= = = substr (的名字03.)) {返回->孩子(财产) ? ?;}elseif“设置”= = = substr (的名字03.)) {价值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 ()方法或属性来设置值:

12 34 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 ());// 'de Jong'var_dump (->调用getChildren ());/ /(人());

你也可以使用__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
/ /……私人孩子们= [];公共函数__call的名字arg游戏财产= lcfirst (substr (的名字3.));如果“得到”= = = substr (的名字03.)) {返回->孩子(财产) ? ?;}elseif“设置”= = = substr (的名字03.)) {价值1= = count (arg游戏) ?arg游戏0]:->孩子(财产] =价值;}}}人();//启用magic __callpropertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();propertyAccessor->setValue (“wouter”,[…]);var_dump (->getWouter ());/ /[…]

5.2

神奇的__set ()方法可以在Symfony 5.2中禁用。ob娱乐下载看到启用其他特性

写入数组属性

PropertyAccessor类允许更新属性中存储的数组的内容加法器而且方法:

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
/ /……/ * * *@varstring [] * /私人孩子们= [];公共函数调用getChildren()数组返回->孩子;}公共函数调用addChild(字符串的名字无效->孩子(的名字] =的名字;}公共函数removeChild(字符串的名字无效设置->孩子(的名字]);}}人();propertyAccessor->setValue (“孩子”, (“凯文”“wouter”]);var_dump (->调用getChildren ());// ['kevin', 'wouter']

PropertyAccess组件检查调用的方法添加< SingularOfThePropertyName > ()而且删除< SingularOfThePropertyName > ().两个方法都必须定义。例如,在前面的示例中,组件查找addChild ()而且作用是:方法来访问孩子们财产。Inflector分量用于查找属性名的单数形式。

如果可行的话,加法器而且方法的优先级高于setter方法。

使用非标准的加/移除方法

有时,加法器和删除器方法不使用标准添加删除前缀,就像这个例子一样:

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
/ /……PeopleList/ /……公共函数joinPeople(字符串无效->民[]=;}公共函数leavePeople(字符串无效foreach->国人民作为id=>) {如果= = =) {设置->民[id]);打破;} } } }使用ob娱乐下载组件PropertyInfoReflectionExtractor使用ob娱乐下载组件PropertyAccessPropertyAccessor列表PeopleList ();reflectionExtractorReflectionExtractor (, (“加入”“离开”]);propertyAccessorPropertyAccessor (PropertyAccessor::DISALLOW_MAGIC_METHODS,真正的reflectionExtractorreflectionExtractor);propertyAccessor->setValue (“人民”, (“凯文”“wouter”]);var_dump (->getPeoples ());// ['kevin', '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”)) {/ /……

混合对象和数组

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

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()返回->孩子;}}人();propertyAccessor->setValue (“孩子[0]”人);getChildren()[0] = new person ()propertyAccessor->setValue (的孩子[0].firstName”“Wouter”);// = $person->getChildren()[0]->firstName = 'Wouter'var_dump (“你好”propertyAccessor->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 20 21 22 23 24 25
/ /……propertyAccessorBuilder= PropertyAccess::createPropertyAccessorBuilder ();propertyAccessorBuilder->enableMagicCall ();//启用magic __callpropertyAccessorBuilder->enableMagicGet ();//启用magic __getpropertyAccessorBuilder->enableMagicSet ();//启用magic __setpropertyAccessorBuilder->enableMagicMethods ();//启用神奇的__get, __set和__callpropertyAccessorBuilder->disableMagicCall ();//禁用magic __callpropertyAccessorBuilder->disableMagicGet ();//禁用magic __getpropertyAccessorBuilder->disableMagicSet ();//禁用magic __setpropertyAccessorBuilder->disableMagicMethods ();//禁用神奇的__get, __set和__call//检查魔术__call, __get或__set处理是否启用propertyAccessorBuilder->isMagicCallEnabled ();// true或falsepropertyAccessorBuilder->isMagicGetEnabled ();// true或falsepropertyAccessorBuilder->isMagicSetEnabled ();// true或false//在最后获得配置的属性访问器propertyAccessorpropertyAccessorBuilder->getPropertyAccessor ();//或全部合一propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();

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

1 2
//允许处理magic的__call, __set而不是__get:propertyAccessorPropertyAccessor (PropertyAccessor::MAGIC_CALL | PropertyAccessor::MAGIC_SET);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。