PropertyAccess组件
PropertyAccess组件¶
PropertyAccess组件提供了使用简单字符串表示法从对象或数组读写的函数。
安装¶
1 |
美元作曲家需要symfony /属性访ob娱乐下载问
|
请注意
如果在Symfony应用程序之外安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章为更多的细节。
使用¶
组件的入口点是createPropertyAccessor ()
工厂。的新实例,该工厂将创建ob娱乐下载Symfony \ \ PropertyAccess \ PropertyAccessor组件
使用默认配置初始化:
使用ob娱乐下载Symfony \ \ PropertyAccess \ PropertyAccess组件;propertyAccessor美元=PropertyAccess::createPropertyAccessor();
读取数组¶
元素可以读取数组getValue ()
方法。这是使用PHP中使用的索引表示法完成的:
/ /……美元的人=(“first_name”= >“Wouter”,];var_dump(propertyAccessor美元->getValue(美元的人,“[first_name]”));/ /“Wouter”var_dump(propertyAccessor美元->getValue(美元的人,“[时代]”));/ /空
如您所见,该方法将返回零
如果索引不存在。但是你可以用enableExceptionOnInvalidIndex ()
方法:
/ /……propertyAccessor美元=PropertyAccess::createPropertyAccessorBuilder()->enableExceptionOnInvalidIndex()->getPropertyAccessor();美元的人=(“first_name”= >“Wouter”,];//代码现在抛出一个类型异常,而不是返回null/ /ob娱乐下载 Symfony \组件\ \ NoSuchIndexException PropertyAccess \异常美元的价值=propertyAccessor美元->getValue(美元的人,“[时代]”);
你也可以使用多维数组:
/ /……美元的人=((“first_name”= >“Wouter”,),(“first_name”= >“瑞恩”,]];var_dump(propertyAccessor美元->getValue(美元的人,“[0][first_name]”));/ /“Wouter”var_dump(propertyAccessor美元->getValue(美元的人,”[1](first_name)”));/ /“瑞恩”
阅读对象¶
的getValue ()
method是一种非常健壮的方法,在处理对象时可以看到它的所有特性。
访问公共属性¶
要从属性中读取,使用“点”符号:
/ /……美元的人=新人();美元的人->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 ()
:
/ /……类人{私人firstName美元=“Wouter”;公共函数getFirstName(){返回这个美元->firstName;}}美元的人=新人();var_dump(propertyAccessor美元->getValue(美元的人,“first_name”));/ /“Wouter”
使用Hassers /伊塞¶
而且还不止于此。如果没有找到getter,则访问器将寻找isser或hasser。这个方法是用与getter相同的方法创建的,这意味着你可以这样做:
/ /……类人{私人美元的作者=真正的;私人美元的孩子=[];公共函数isAuthor(){返回这个美元->作者;}公共函数hasChildren(){返回0= = !数(这个美元->孩子们);}}美元的人=新人();如果(propertyAccessor美元->getValue(美元的人,“作者”)){var_dump("这个人是个作家");}如果(propertyAccessor美元->getValue(美元的人,“孩子”)){var_dump(“这个人有孩子”);}
这将会产生:这人是一个作者
访问不存在的属性路径¶
默认情况下一个ob娱乐下载Symfony \组件\ \ NoSuchPropertyException PropertyAccess \异常
如果属性路径传递给getValue ()
不存在。属性更改此行为disableExceptionOnInvalidPropertyPath ()
方法:
/ /……类人{公共美元的名字;}美元的人=新人();propertyAccessor美元=PropertyAccess::createPropertyAccessorBuilder()->disableExceptionOnInvalidPropertyPath()->getPropertyAccessor();//下面的代码返回null,而不是抛出异常美元的价值=propertyAccessor美元->getValue(美元的人,“生日”);
魔法__get ()
方法¶
的getValue ()
方法也可以用魔术__get ()
方法:
/ /……类人{私人美元的孩子=(“Wouter”= >(…),];公共函数__get($ id){返回这个美元->孩子们($ id];}}美元的人=新人();var_dump(propertyAccessor美元->getValue(美元的人,“Wouter”));/ /[…]
5.2新版功能:神奇的__get ()
方法可以在Symfony 5.2中禁用。ob娱乐下载看到使其他特性。
魔法__call ()
方法¶
最后,getValue ()
可以使用魔法__call ()
方法,但是您需要通过使用来启用该特性ob娱乐下载Symfony \ \ PropertyAccess \ PropertyAccessorBuilder组件
:
/ /……类人{私人美元的孩子=(“wouter”= >(…),];公共函数__call(美元的名字,args美元){美元的财产=lcfirst(字符串的子串(美元的名字,3.));如果(“得到”===字符串的子串(美元的名字,0,3.)){返回这个美元->孩子们(美元的财产]? ?零;}elseif(“设置”===字符串的子串(美元的名字,0,3.)){美元的价值=1= =数(args美元)吗?args美元(0]:零;这个美元->孩子们(美元的财产]=美元的价值;}}}美元的人=新人();//启用PHP __call()魔法方法propertyAccessor美元=PropertyAccess::createPropertyAccessorBuilder()->enableMagicCall()->getPropertyAccessor();var_dump(propertyAccessor美元->getValue(美元的人,“wouter”));/ /[…]
谨慎
的__call ()
特性默认情况下是禁用的,您可以通过调用来启用它enableMagicCall ()
看到使其他特性。
写入数组¶
的PropertyAccessor
类不仅可以读数组,还可以写数组。可以使用setValue ()
方法:
/ /……美元的人=[];propertyAccessor美元->setValue(美元的人,“[first_name]”,“Wouter”);var_dump(propertyAccessor美元->getValue(美元的人,“[first_name]”));/ /“Wouter”/ /或/ / var_dump($人[' first_name ']);/ /“Wouter”
写作对象¶
的setValue ()
方法具有相同的特性getValue ()
方法。您可以使用setter,这很神奇__set ()
方法或属性来设置值:
/ /……类人{公共firstName美元;私人美元的姓;私人美元的孩子=[];公共函数setLastName(美元的名字){这个美元->姓=美元的名字;}公共函数getLastName(){返回这个美元->姓;}公共函数调用getChildren(){返回这个美元->孩子们;}公共函数__set(美元的财产,美元的价值){这个美元->美元的财产=美元的价值;}}美元的人=新人();propertyAccessor美元->setValue(美元的人,“firstName”,“Wouter”);propertyAccessor美元->setValue(美元的人,“姓”,”德容);// setLastName被调用propertyAccessor美元->setValue(美元的人,“孩子”,(新人()));// __set被调用var_dump(美元的人->firstName);/ /“Wouter”var_dump(美元的人->getLastName());/ /“德容”var_dump(美元的人->调用getChildren());/ /(人());
你也可以使用__call ()
要设置值,但您需要启用该特性,请参见使其他特性:
/ /……类人{私人美元的孩子=[];公共函数__call(美元的名字,args美元){美元的财产=lcfirst(字符串的子串(美元的名字,3.));如果(“得到”===字符串的子串(美元的名字,0,3.)){返回这个美元->孩子们(美元的财产]? ?零;}elseif(“设置”===字符串的子串(美元的名字,0,3.)){美元的价值=1= =数(args美元)吗?args美元(0]:零;这个美元->孩子们(美元的财产]=美元的价值;}}}美元的人=新人();//启用magic __callpropertyAccessor美元=PropertyAccess::createPropertyAccessorBuilder()->enableMagicCall()->getPropertyAccessor();propertyAccessor美元->setValue(美元的人,“wouter”,(…]);var_dump(美元的人->getWouter());/ /[…]
5.2新版功能:神奇的__set ()
方法可以在Symfony 5.2中禁用。ob娱乐下载看到使其他特性。
写入数组属性¶
的PropertyAccessor
类允许更新属性中存储的数组内容加法器和剂方法:
/ /……类人{/ * ** @var string []* /私人美元的孩子=[];公共函数调用getChildren():数组{返回这个美元->孩子们;}公共函数调用addChild(字符串美元的名字):无效{这个美元->孩子们(美元的名字]=美元的名字;}公共函数removeChild(字符串美元的名字):无效{设置(这个美元->孩子们(美元的名字]);}}美元的人=新人();propertyAccessor美元->setValue(美元的人,“孩子”,(“凯文”,“wouter”]);var_dump(美元的人->调用getChildren());/ /(“凯文”、“wouter”)
PropertyAccess组件检查调用的方法添加< SingularOfThePropertyName > ()
和删除< SingularOfThePropertyName > ()
。这两个方法都必须定义。例如,在前面的示例中,组件查找addChild ()
和作用是:
方法来访问孩子们
财产。偏转器组件用于查找属性名的单数。
如果可行的话,加法器和剂方法优先于asetter方法。
使用非标准的加法器/移除器方法¶
有时,加法器和移除器方法不使用标准添加
或删除
前缀,就像这个例子:
/ /……类PeopleList{/ /……公共函数joinPeople(字符串美元的人):无效{这个美元->国人民[]=美元的人;}公共函数leavePeople(字符串美元的人):无效{foreach(这个美元->国人民作为$ id= >美元的项目){如果(美元的人===美元的项目){设置(这个美元->国人民($ id]);打破;}}}}使用ob娱乐下载Symfony \ \ PropertyInfo \器\ ReflectionExtractor组件;使用ob娱乐下载Symfony \ \ PropertyAccess \ PropertyAccessor组件;美元的列表=新PeopleList();reflectionExtractor美元=新ReflectionExtractor(零,零,(“加入”,“离开”]);propertyAccessor美元=新PropertyAccessor(PropertyAccessor::DISALLOW_MAGIC_METHODS,假,零,真正的,reflectionExtractor美元,reflectionExtractor美元);propertyAccessor美元->setValue(美元的人,“人民”,(“凯文”,“wouter”]);var_dump(美元的人->getPeoples());/ /(“凯文”、“wouter”)
而不是打电话添加< SingularOfThePropertyName > ()
和删除< SingularOfThePropertyName > ()
, PropertyAccess组件将调用加入< SingularOfThePropertyName > ()
和离开< SingularOfThePropertyName > ()
方法。
检查属性的路径¶
当你想检查是否getValue ()
可以安全地调用而不用实际调用那个方法,可以使用吗isReadable ()
而不是:
美元的人=新人();如果(propertyAccessor美元->isReadable(美元的人,“firstName”)){/ /……}
这也是可能的setValue ()
:电话isWritable ()
方法来确定属性路径是否可以更新:
美元的人=新人();如果(propertyAccessor美元->isWritable(美元的人,“firstName”)){/ /……}
混合对象和数组¶
你也可以混合使用对象和数组:
/ /……类人{公共firstName美元;私人美元的孩子=[];公共函数setChildren(美元的孩子){这个美元->孩子们=美元的孩子;}公共函数调用getChildren(){返回这个美元->孩子们;}}美元的人=新人();propertyAccessor美元->setValue(美元的人,“孩子[0]”,新人);// getChildren() = new person ()propertyAccessor美元->setValue(美元的人,的孩子[0].firstName”,“Wouter”);// = $person->getChildren()[0]-> name = 'Wouter'var_dump(“你好”。propertyAccessor美元->getValue(美元的人,的孩子[0].firstName”));/ /“Wouter”// = $person->getChildren()[0]->firstName
使其他特性¶
的ob娱乐下载Symfony \ \ PropertyAccess \ PropertyAccessor组件
可以配置以启用额外的功能。要做到这一点,你可以用ob娱乐下载Symfony \ \ PropertyAccess \ PropertyAccessorBuilder组件
:
/ /……propertyAccessorBuilder美元=PropertyAccess::createPropertyAccessorBuilder();propertyAccessorBuilder美元->enableMagicCall();//启用__callpropertyAccessorBuilder美元->enableMagicGet();//启用magic __getpropertyAccessorBuilder美元->enableMagicSet();//启用magic __setpropertyAccessorBuilder美元->enableMagicMethods();//启用magic __get, __set和__callpropertyAccessorBuilder美元->disableMagicCall();//禁用__callpropertyAccessorBuilder美元->disableMagicGet();//禁用magic __getpropertyAccessorBuilder美元->disableMagicSet();//禁用__set魔法propertyAccessorBuilder美元->disableMagicMethods();//禁用魔法__get, __set和__call//检查是否启用了__call, __get或__set处理propertyAccessorBuilder美元->isMagicCallEnabled();//对还是错propertyAccessorBuilder美元->isMagicGetEnabled();//对还是错propertyAccessorBuilder美元->isMagicSetEnabled();//对还是错//在最后获取配置的属性访问器propertyAccessor美元=propertyAccessorBuilder美元->getPropertyAccessor();//或者全在一起propertyAccessor美元=PropertyAccess::createPropertyAccessorBuilder()->enableMagicCall()->getPropertyAccessor();
或者你可以直接将参数传递给构造函数(不是推荐的方式):
//启用处理__call, __set但不__get:propertyAccessor美元=新PropertyAccessor(PropertyAccessor::MAGIC_CALL|PropertyAccessor::MAGIC_SET);
该工作,包括代码示例,根据a根据sa 3.0的知识共享许可证。