我已经编写了一个辅助函数来“清理”回调变量以输入到 MySQL 中。这是我写的函数:
public function string($object, $objectPath) {
if (!empty($object->$objectPath) || $object->$objectPath !== '') {
$value = $object->$objectPath;
} else {
return 'NULL';
}
if (!empty($value) || $value != '') {
return "'".str_replace("'","''",$value)."'";
} else {
return 'NULL';
}
}
现在,$object
始终是调用返回的对象,$objectPath
始终是指向给定值的字符串。这就是问题所在。这有效:
$value = $this->db->string($object, 'foo');
但是,这不起作用:
$value = $this->db->string($object, 'foo->bar->foo1->bar1');
每当 $objectPath
超过“一层”深度时,我会从(Amazon 的)客户端库中收到以下错误:
Fatal error: Call to undefined method MarketplaceWebServiceOrders_Model_Order::getFoo->Bar() in /path/to/Model.php on line 63
错误所指的代码块是这样的:
public function __get($propertyName)
{
$getter = "get$propertyName";
return $this->$getter(); // this is line 63
}
$object
不是 XML,所以我不能使用 SimpleXMLElement
和 XPath
。
我的代码有什么问题?是我连接一个对象和一个字符串吗?如果是这样,我怎样才能做到这一点?我怎样才能让这个函数做我想做的事?
顺便说一下,我使用的是 PHP 5.4.27。
最佳答案
PHP 不会像您尝试的那样自动将包含多个路径级别的字符串解析为对象的子对象。
即使 $obj
包含您期望的子层次结构,这也将不工作:
$obj = ...;
$path = 'level1->level2->level3';
echo $obj->$path; // WRONG!
您需要拆分路径并“遍历”对象以尝试解析最终属性。 这是一个基于您的示例:
<?php
$obj = new stdClass();
$obj->name = 'Fred';
$obj->job = new stdClass();
$obj->job->position = 'Janitor';
$obj->job->years = 4;
print_r($obj);
echo 'Years in current job: '.string($obj, 'job->years').PHP_EOL;
function string($obj, $path_str)
{
$val = null;
$path = preg_split('/->/', $path_str);
$node = $obj;
while (($prop = array_shift($path)) !== null) {
if (!is_object($obj) || !property_exists($node, $prop)) {
$val = null;
break;
}
$val = $node->$prop;
// TODO: Insert any logic here for cleaning up $val
$node = $node->$prop;
}
return $val;
}
它在这里工作:http://3v4l.org/9L4gc
关于PHP:如何解析多层次对象的动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247449/