Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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序列化重写私有“受保护和stdClass”;“反思”;_Php_Serialization - Fatal编程技术网

PHP序列化重写私有“受保护和stdClass”;“反思”;

PHP序列化重写私有“受保护和stdClass”;“反思”;,php,serialization,Php,Serialization,我在Marco Pivetta的文章中读到,classprivate和protected属性可以通过(数组)通过简单的强制转换读取,并在属性之前附加一些“键”: “\0*\0”-用于受保护; “\0CLASSNAME\0”-用于专用 class Foo { protected $a = 'protected_prop'; private $b = 'private_prop'; function out(){ var_dump($this->a); va

我在Marco Pivetta的文章中读到,class
private
protected
属性可以通过
(数组)
通过简单的强制转换读取,并在属性之前附加一些
“键”

“\0*\0”
-用于受保护;
“\0CLASSNAME\0”
-用于专用

class Foo {
  protected $a  = 'protected_prop';
  private $b = 'private_prop';

  function out(){
     var_dump($this->a);
     var_dump($this->b);
  }
}

$F = new F();
$data = (array)$F;
var_dump($data["\0*\0a"]);
var_dump($data["\0Foo\0b"]);
// output
string(14) "protected_prop" 
string(12) "private_prop"
然后我决定尝试覆盖私有和受保护的属性。这个“键”(\0Foo\0b)让我想起了序列化

$F = serialize($F);
$F = str_replace('protected_prop','new_protected_prop',$F);
$F = str_replace('private_prop','new_private_prop',$F);
$F = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {      
   return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) .   ':"' . $match[2] . '";';
 },$F ); //  fix unserialize(): Error at offset after str_replacing. Found on SO ^)

$F = unserialize($F);
if ($F instanceof Foo){
   $F->out();
}   
// output
string(18) "new_protected_prop" 
string(16) "new_private_prop" 
object(Foo)#1 (2) { 
 ["a":protected]=> string(18) "new_protected_prop"  // changed
 ["b":"Foo":private]=> string(16) "new_private_prop" // changed
} 
问题:为什么我们可以通过此方法在外部更改所有私有和受保护的属性?还是序列化中的it语言(PHP)冲突?谢谢


您认为“受保护”是什么意思?@sectus在OOP中是什么意思-对私有和受保护成员的外部访问(读/写)。Languange不必保护私有和受保护成员免受所有可能的修改,IMHO。甚至这些成员还可以通过设计(反射)用语言编辑。此外,编辑序列化对象的文本不是OOP概念的一部分。