Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态修改PHP对象属性_Php_Oop_Object - Fatal编程技术网

动态修改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>');