1

可能重复:
在 PHP 中,我如何访问对象中的“:private”数组?

我不确定是否有正确的方法可以做到这一点,或者这是否是完全不可接受的技术。

我正在使用 PHP,并且我的脚本被赋予了一个对象,它无权访问对象类并且许多属性受到保护(见下文)。

是否可以手动“破解”(单词选择错误)对象以动态修改属性值?
不确定一种方法可以做到这一点,或者是否有一种方法可以转换一种方法然后再返回。

object(__PHP_Incomplete_Class)#3 (16) {


["__PHP_Incomplete_Class_Name"]=>
  string(28) "Zend_Controller_Request_Http"
  ["_paramSources":protected]=>
  array(2) {
    [0]=>
    string(4) "_GET"
    [1]=>
    string(5) "_POST"
  }
  ["_requestUri":protected]=>
  string(13) "/?mod=mainnav"
  ["_baseUrl":protected]=>
  NULL
  ["_basePath":protected]=>
  NULL
  ["_pathInfo":protected]=>
  string(0) ""
  ["_params":protected]=>
  array(0) {
  }
  ["_rawBody":protected]=>
  NULL
  ["_aliases":protected]=>
  array(0) {
  }
  ["_dispatched":protected]=>
  bool(false)
  ["_module":protected]=>
  NULL
  ["_moduleKey":protected]=>
  string(6) "module"
  ["_controller":protected]=>
  NULL
  ["_controllerKey":protected]=>
  string(10) "controller"
  ["_action":protected]=>
  NULL
  ["_actionKey":protected]=>
  string(6) "action"
}
4

2 回答 2

1

如果属性受到保护,您可以创建一个从该类扩展的类并修改任何属性。如果它们是私有的,请查看反射:

$reflecRequest = new ReflectionObject($request);
$reflecRequestProp = $reflecRequest->getProperty('_requestUri');
$reflecRequestProp->setAccessible(true);
$reflecRequestProp->setValue($request, 'newUri');
于 2013-01-16T16:31:12.037 回答
1

最终使用更简单的技术来做到这一点。
我将对象序列化为字符串。因此,我只是使用 preg_replace 将当前值(我一直拥有)替换为新值。

有一些正则表达式可以找到变量名,然后我可以更改它的值(所以不需要知道值),但我还不能完成它(我确实有当前值)。

$objectA = serialize($request);
$current_url = '\?mod=mainnav';
$new_url = 'newpage';
$objectB = preg_replace('/'.$current_url.'/', $new_url, $objectA);

//check the new object
var_dump('<pre>');
var_dump(unserialize($objectB));
var_dump('</pre>');

大多数时候,使用反射可能是更好的技术,但对于我在这里需要的东西,我觉得这是一种简单而快速的方法,并且可以保留所有其他对象属性。

于 2013-01-17T09:25:51.373 回答