Answers:
像这样
<?php
$prop = 'Name';
echo $obj->$prop;
或者,如果您可以控制该类,请实现ArrayAccess接口,然后执行此操作
echo $obj['Name'];
ArrayAccess
,Countable
和迭代器接口之一,它是从一个正常的大多是没有区别array()
如果要访问属性而不创建中间变量,请使用{}
表示法:
$something = $object->{'something'};
这还允许您例如在循环中构建属性名称:
for ($i = 0; $i < 5; $i++) {
$something = $object->{'something' . $i};
// ...
}
$this->{$property}[$name]
,否则$this->$property[$name]
将引发错误
$this->$property[$name]
尽管这可能是一个错误,但实际上可能会成功。$name
被静默转换为整数。如果是非数字字符串,则为0
。然后,该值的字符串索引$property
用作属性名称。如果$property
保留值“ abc”,则它将引用属性$this->a
(索引0)。如果有这样的属性,那么它将成功。
您要问的是所谓的Variable Variables。您需要做的就是将字符串存储在变量中,然后像这样访问它:
$Class = 'MyCustomClass';
$Property = 'Name';
$List = array('Name');
$Object = new $Class();
// All of these will echo the same property
echo $Object->$Property; // Evaluates to $Object->Name
echo $Object->{$List[0]}; // Use if your variable is in an array
像这样吗 尚未测试,但应该可以正常工作。
function magic($obj, $var, $value = NULL)
{
if($value == NULL)
{
return $obj->$var;
}
else
{
$obj->$var = $value;
}
}
可能会有这个问题的答案,但您可能想看看这些向PHP 7的迁移
资料来源:php.net
万一其他人想找到未知深度的深层属性,我想出了以下内容而无需遍历所有子级的所有已知属性。
例如,要查找$ Foo-> Bar-> baz或$ Foo-> baz或$ Foo-> Bar-> Baz-> dave,其中$ path是类似于'foo / bar / baz'的字符串。
public function callModule($pathString, $delimiter = '/'){
//split the string into an array
$pathArray = explode($delimiter, $pathString);
//get the first and last of the array
$module = array_shift($pathArray);
$property = array_pop($pathArray);
//if the array is now empty, we can access simply without a loop
if(count($pathArray) == 0){
return $this->{$module}->{$property};
}
//we need to go deeper
//$tmp = $this->Foo
$tmp = $this->{$module};
foreach($pathArray as $deeper){
//re-assign $tmp to be the next level of the object
// $tmp = $Foo->Bar --- then $tmp = $Bar->baz
$tmp = $tmp->{$deeper};
}
//now we are at the level we need to be and can access the property
return $tmp->{$property};
}
然后调用类似:
$propertyString = getXMLAttribute('string'); // '@Foo/Bar/baz'
$propertyString = substr($propertyString, 1);
$moduleCaller = new ModuleCaller();
echo $moduleCaller->callModule($propertyString);
这是我的尝试。它内置了一些常见的“愚蠢”检查,确保您不会尝试设置或获取不可用的成员。
您可以将“ property_exists”检查分别移到__set和__get,然后直接在magic()中调用它们。
<?php
class Foo {
public $Name;
public function magic($member, $value = NULL) {
if ($value != NULL) {
if (!property_exists($this, $member)) {
trigger_error('Undefined property via magic(): ' .
$member, E_USER_ERROR);
return NULL;
}
$this->$member = $value;
} else {
if (!property_exists($this, $member)) {
trigger_error('Undefined property via magic(): ' .
$member, E_USER_ERROR);
return NULL;
}
return $this->$member;
}
}
};
$f = new Foo();
$f->magic("Name", "Something");
echo $f->magic("Name") , "\n";
// error
$f->magic("Fame", "Something");
echo $f->magic("Fame") , "\n";
?>
该函数的作用是检查该属性是否存在于其孩子的任何此类的该类上,如果存在,则获取该值,否则返回null。因此,现在这些属性是可选的并且是动态的。
/**
* check if property is defined on this class or any of it's childes and return it
*
* @param $property
*
* @return bool
*/
private function getIfExist($property)
{
$value = null;
$propertiesArray = get_object_vars($this);
if(array_has($propertiesArray, $property)){
$value = $propertiesArray[$property];
}
return $value;
}
用法:
const CONFIG_FILE_PATH_PROPERTY = 'configFilePath';
$configFilePath = $this->getIfExist(self::CONFIG_FILE_PATH_PROPERTY);
$classname = "myclass";
$obj = new $classname($params);
$variable_name = "my_member_variable";
$val = $obj->$variable_name; //do care about the level(private,public,protected)
$func_name = "myFunction";
$val = $obj->$func_name($parameters);
为什么要编辑:之前:使用eval(evil)之后:完全没有eval。用这种语言老了。