PropertyAccess组件

5.2版本
维护 没有维护的

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的知识共享许可证。