动态修改PHP对象属性
可能重复:动态修改PHP对象属性,php,oop,object,Php,Oop,Object,可能重复: 我不确定是否有正确的方法,或者这是完全不可接受的技术。 我使用的是PHP,脚本被赋予了一个对象,它没有访问对象类的权限,并且许多属性都受到保护(见下文)。 是否可以手动“破解”(词语选择不当)对象以动态修改属性值 不确定是否有办法做到这一点,或者是否有办法将一种方式转换为另一种方式 object(__PHP_Incomplete_Class)#3 (16) { ["__PHP_Incomplete_Class_Name"]=> string(28) "Zend_Con
我不确定是否有正确的方法,或者这是完全不可接受的技术。
我使用的是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"
}
如果属性受保护,则可以创建一个从该类扩展的类并修改任何属性。如果它们是私人的,请查看反射:
$reflecRequest = new ReflectionObject($request);
$reflecRequestProp = $reflecRequest->getProperty('_requestUri');
$reflecRequestProp->setAccessible(true);
$reflecRequestProp->setValue($request, 'newUri');
最后使用了一种更简单的技术来实现这一点。
我已将对象序列化为字符串。因此,我只是使用preg_replace将当前值(我一直都有)替换为新值。
有一些正则表达式可以找到变量名,然后我可以更改它的值(因此不需要知道值),但我还不能完成(我有当前值)
$objectA=序列化($request);
$current\u url='\?mod=mainnav';
$new_url='newpage';
$objectB=preg_replace('/'.$current_url'/',$new_url,$objectA);
//检查新对象
var_dump(“”);
var_dump(未序列化($objectB));
var_dump(“”);
在大多数情况下,使用反射可能是更好的技术,但对于我在这里需要的,我觉得这是一种简单而快速的方法,并保留了所有其他对象属性。您不能改为更改对象的类吗?或者扩展它?那么,您想修改对象的
受保护的
属性吗?如果有办法转换对象类,请修复受保护的属性,然后重新更改对象名称。整个过程都是序列化的,并在最后进行md5编码,因此它必须与Zend Framework应用程序中的一个匹配。如果没有访问所需的Zend Framework,可能是不可能的。Zend Framework是开源的,免费提供,并且可能安装在发生错误的Web服务器上,因此您应该可以访问它。但是,如果这源于一个未序列化的文件,那么罪魁祸首很可能是随着时间的推移类发生了变化,而您取消了一个旧字符串的序列化。在这种情况下,你只想把它扔掉。你能提供更多的细节吗。文件来自哪里?缓存?谢谢,看来“反射”是个不错的选择。我不能从这里进入类库。恐怕这件事必须马上完成,并使用当时的物体。我正在尝试使用PHP反射对象,但我不确定是否能够生成上面打印的内容的精确副本(但使用不同的参数值),目前我有$request=$object$reflectionClass=新的reflectionClass('Zend_Controller_Request_Http')$reflectionProperty=$reflectionClass->getProperty(“U请求URI”)$reflectionProperty->setAccessible(true)$reflectionClass->getProperty(''u requestUri')->setValue('newUri')代码>尝试此$reflecRequest=newreflectionobject($request)$reflecRequestProp=$reflecRequest->getProperty(“u requestUri”)$reflecRequestProp->setAccessible(true)$reflecRequestProp->setValue('newUri');谢谢,它有名字(这是一个巨大的胜利),但没有成员属性。希望有一个快速修复程序。生成“警告:ReflectionProperty::setValue()需要2个参数,1个give”将最后一行更改为$reflecRequestProp->setValue($reflecRequest,'newUri')
并打印该属性,但不打印其他属性,至少我可以在此处手动添加其余属性。谢谢
$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>');