可能重复:
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"
}
答案 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可能是大多数时候更好的技术,但是对于我在这里需要的东西,我觉得这是一种简单快捷的方法,并保留所有其他对象属性。