PropertyAccess组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
PropertyAccess组件
PropertyAccess组件提供了使用简单字符串表示法读写对象或数组的功能。
2.2
PropertyAccess组件是在Symfony 2.2中引入的。ob娱乐下载在此之前,PropertyPath
类位于Form组件中。
安装
您可以通过两种不同的方式安装组件:
- 通过Composer安装(
ob娱乐下载symfony /属性访问
在Packagist); - 使用官方Git存储库(https://github.com/ob娱乐下载symfony/PropertyAccess).
使用
该组件的入口点是PropertyAccess: createPropertyAccessor工厂。类的新实例PropertyAccessor使用默认配置初始化:
1 2 3
使用ob娱乐下载\组件\PropertyAccess\PropertyAccess;$访问器= PropertyAccess::createPropertyAccessor ();
2.3
的createPropertyAccessor ()方法是在Symfony 2.3中引入的。ob娱乐下载之前,它被称为getPropertyAccessor ()
.
从数组读取
属性可以读取数组PropertyAccessor: getValue方法。这是使用PHP中使用的索引符号完成的:
1 2 3 4 5 6 7
/ /……$人=数组(“first_name”= >“Wouter”,);回声$访问器->getValue ($人,“[first_name]”);/ /“Wouter”回声$访问器->getValue ($人,“[时代]”);/ /空
如您所见,该方法将返回零
如果索引不存在。
你也可以使用多维数组:
12 3 4 5 6 7 8 9 10 11 12
/ /……$人=数组(数组(“first_name”= >“Wouter”),数组(“first_name”= >“瑞恩”,));回声$访问器->getValue ($人,“[0][first_name]”);/ /“Wouter”回声$访问器->getValue ($人,”[1](first_name)”);/ /“瑞恩”
从对象读取
的getValue
方法是一种非常健壮的方法,在处理对象时可以看到它的所有特性。
进入公共物业
要从属性中读取,请使用“点”符号:
1 2 3 4 5 6 7 8 9 10 11
/ /……$人=新人();$人->firstName =“Wouter”;回声$访问器->getValue ($人,“firstName”);/ /“Wouter”$孩子=新人();$孩子->firstName =“酒吧”;$人->孩子=数组($孩子);回声$访问器->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;}}$人=新人();回声$访问器->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 ($人,“作者”)) {回声“他是个作家”;}如果($访问器->getValue ($人,“孩子”)) {回声“他有孩子”;}
这将产生:他是个作家
魔法__get ()
方法
的getValue
也可以用魔法的方法__get
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……类人{私人$孩子们=数组(“Wouter”= >数组(…),);公共函数__get($id){返回$这->孩子($id];}}$人=新人();回声$访问器->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]:零;$这->孩子($财产] =$价值;}}}$人=新人();//启用magic __call$访问器= PropertyAccess::getPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();回声$访问器->getValue ($人,“wouter”);/ /数组(…)
2.3
魔法的使用__call ()
方法是在Symfony 2.3中引入的。ob娱乐下载
谨慎
的__call
功能在默认情况下是禁用的,您可以通过调用来启用它PropertyAccessorBuilder: enableMagicCallEnabled看到启用其他特性.
写入数组
的PropertyAccessor
类不仅可以读取数组,还可以写入数组。可以使用PropertyAccessor:: setValue方法:
1 2 3 4 5 6 7 8
/ /……$人=数组();$访问器->setValue ($人,“[first_name]”,“Wouter”);回声$访问器->getValue ($人,“[first_name]”);/ /“Wouter”/ /或// echo $person['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 ($人,“孩子”,数组(新人()));回声$人->firstName;/ /“Wouter”回声$人->getLastName ();// 'de Jong'回声$人->孩子;/ /数组(人());
你也可以使用__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$访问器= PropertyAccess::getPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();$访问器->setValue ($人,“wouter”,数组(…));回声$人->getWouter ();/ /数组(…)
混合对象和数组
你也可以混合使用对象和数组:
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'回声“你好”.$访问器->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 __call$accessorBuilder->enableMagicCall ();//禁用magic __call$accessorBuilder->disableMagicCall ();//检查是否启用了magic __call处理$accessorBuilder->isMagicCallEnabled ()// true或false//在最后获得配置的属性访问器$访问器=$accessorBuilder->getPropertyAccessor ();//或全部合一$访问器= PropertyAccess::createPropertyAccessorBuilder ()->enableMagicCall ()->getPropertyAccessor ();
或者你可以直接将参数传递给构造函数(不是推荐的方式):
1 2
/ /……$访问器=新PropertyAccessor (真正的)//这样就可以处理magic __call