动态修改PHP对象属性

时间:2013-01-16 16:19:11

标签: php oop object

  

可能重复:
  In PHP how can I access a “:private” array in an object?

我不确定是否有正确的方法来执行此操作,或者这是否是完全不可接受的技术。

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

有可能手动“破解”(错误选择单词)对象来动态修改属性值吗?
不知道如何做到这一点,或者是否有办法转换一种方式然后再转回。

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"
}

2 个答案:

答案 0 :(得分:1)

如果属性受到保护,您可以创建一个从此扩展的类并修改任何属性。如果他们是私人的,请看反思:

$reflecRequest = new ReflectionObject($request);
$reflecRequestProp = $reflecRequest->getProperty('_requestUri');
$reflecRequestProp->setAccessible(true);
$reflecRequestProp->setValue($request, 'newUri');

答案 1 :(得分:1)

使用更简单的技术完成此操作 我将Object序列化为一个字符串。所以我只是使用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>');

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

相关问题