PropertyAccess组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
PropertyAccess组件
PropertyAccess组件提供了使用简单字符串表示法读写对象或数组的功能。
安装
1
$作曲家需要symfony/propob娱乐下载erty-access
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
使用
该组件的入口点是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 ()方法:
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(“这个人有孩子”);}
这将产生:这个人是作家
访问不存在的属性路径
4.3
的disableExceptionOnInvalidPropertyPath ()
方法是在Symfony 4.3中引入的。ob娱乐下载
默认为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”= >[…]];公共函数__get($id){返回$这->孩子($id];}}$人=新人();var_dump ($propertyAccessor->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 ($的名字,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 ()
方法或属性来设置值:
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 29 30
/ /……类人{私人$孩子们= [];公共函数__call($的名字,$arg游戏){$财产= lcfirst (substr ($的名字,3.));如果(“得到”= = = substr ($的名字,0,3.)) {返回收取($这->孩子($财产]) ?$这->孩子($财产]:零;}elseif(“设置”= = = substr ($的名字,0,3.)) {$价值=1= = count ($arg游戏) ?$arg游戏[0]:零;$这->孩子($财产] =$价值;}}}$人=新人();//启用magic __call$propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();$propertyAccessor->setValue ($人,“wouter”,[…]);var_dump ($人->getWouter ());/ /[…]
写入数组属性
的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方法。
检查属性路径
当你想检查是否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
/ /……$propertyAccessorBuilder= PropertyAccess::createPropertyAccessorBuilder ();//启用magic __call$propertyAccessorBuilder->enableMagicCall ();//禁用magic __call$propertyAccessorBuilder->disableMagicCall ();//检查是否启用了magic __call处理$propertyAccessorBuilder->isMagicCallEnabled ();// true或false//在最后获得配置的属性访问器$propertyAccessor=$propertyAccessorBuilder->getPropertyAccessor ();//或全部合一$propertyAccessor= PropertyAccess::createPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();
或者你可以直接将参数传递给构造函数(不是推荐的方式):
1 2
/ /……$propertyAccessor=新PropertyAccessor (真正的);//这样就可以处理magic __call