1

重複の可能性:
PHPで、オブジェクトの「:private」配列にアクセスするにはどうすればよいですか?

これを行う正しい方法があるのか​​、それともこれが完全に受け入れられない手法なのかはわかりません。

私はPHPを使用していますが、スクリプトにオブジェクトが与えられ、オブジェクトクラスにアクセスできず、多くのプロパティが保護されている状況にあります(以下を参照)。

オブジェクトを手動で「ハッキング」(単語の選択が間違っている)して、プロパティ値をその場で修正することは可能ですか?
これを行う方法がわからない、または1つの方法を変換してから、もう一度戻す方法があるかどうか。

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

プロパティが保護されている場合は、このクラスから拡張するクラスを作成し、任意のプロパティを変更できます。彼らが私的なものである場合は、Reflectionを見てください。

$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>');

ほとんどの場合、Reflectionsを使用する方が優れた手法ですが、ここで必要なのは、これが簡単で高速な方法であり、他のすべてのオブジェクトプロパティを保持していることです。

于 2013-01-17T09:25:51.373 に答える