Можете ли вы объяснить следующее интересное поведение?
class test {
//Class *test* has two properties, public and private.
public $xpublic = 'x1';
private $xprivate = 'x2';
}
$testObj = new test();
Давайте преобразуем $testObj
в массив.
settype($testObj, 'array');
var_dump($testObj);
Результат:
array(2) {
["xpublic"]=> string(3) "x1"
["testxprivate"]=> string(4) "x2"
}
ОК,xprivate
свойство становится testxprivate
Давайте преобразуем этот массив в объект.
$newObj = (object)$testObj;
var_dump($newObj);
Результат:
object(stdClass)#1 (2) {
["xpublic"]=> string(3) "xxx"
["xprivate":"test":private]=> string(4) "xxx3"
}
$newObj
является объектом stdClass
.
И вопрос такой:
Почему testxprivate
становится частной собственностью xprivate
(не testxprivate
) нового объекта?Как PHP узнает, что массив $testObj
был объектом?
Если я определю равный массив:
$testArray = array('xpublic'=>'x1', 'testxprivate'=>'x2');
, а затем преобразую его в объект:
var_dump((object)$testArray);
Я получу объект с двумя открытыми свойствами xpublic
и testxprivate
, как и ожидалось:
object(stdClass)#2 (2) {
["xpublic"]=> string(2) "x1"
["testxprivate"]=> string(2) "x2"
}