PHP:如何解析多层次对象的动态属性

标签 php mysql string object amazon-web-services

我已经编写了一个辅助函数来“清理”回调变量以输入到 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,所以我不能使用 SimpleXMLElementXPath

我的代码有什么问题?是我连接一个对象和一个字符串吗?如果是这样,我怎样才能做到这一点?我怎样才能让这个函数做我想做的事?

顺便说一下,我使用的是 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/

相关文章:

php - 如何使用opencart向数据库中插入数据?

PHP 工作代码出现奇怪的问题

php - 如何在收到新消息时收到通知,例如 Facebook

php - 如果时差大于 50 分钟则显示消息 - php

php - 在 Ruby 中解密 PHP MCRYPT_RIJNDAEL_256

python - python 字符串中的 dict 和固定参数

c++ - C++ 读写文件

c++ - 这段 C 代码有什么问题?我想知道输入字符串中 1 的个数

python - Python 中 MySQLdb 模块的手册页在哪里?

java - JPA nativeQuery 返回缓存的 resultList