печать r показывает частный var. Почему?


Почему print_r может видеть частное свойство $версия , даже если его область действия установлена в частное ?

class myClass {

    private $version;

    public function set_version($value){
        $this->version = $value;
    }


}



$class = new myClass();
$class->set_version("1.2");

echo "<pre>";
print_r($class);
Author: Sᴀᴍ Onᴇᴌᴀ, 2017-01-23

2 answers

Print_r() показывает свойства закрытого элемента для целей отладки. Он не должен использоваться для вывода объекта в целях отображения (например, в представлении/странице). Для отображения информации об объекте, вероятно, было бы целесообразно создать метод (например, toString), который вернет соответствующую информацию.

Print_r(), var_dump() и var_export() также будут отображаться защищенные и частные свойства объектов. Статические члены класса не будет показано.1


1http://php.net/manual/en/function.print-r.php#refsect1-function.print-r-description)

 7
Author: Sᴀᴍ Onᴇᴌᴀ, 2018-05-03 13:03:53

Кроме того, начиная с PHP 5.6.0 вы можете использовать __debuginfo(), что позволит вам переопределить или уточнить то, что print_r(), var_dump() результаты.

Так, например, используя кодирование и декодирование json, вы можете возвращать только общедоступные свойства.

<?php
class myClass {

    private $private_var;

    public $public_var = 'Foobar';

    public function setPrivate($value)
    {
        $this->private_var = $value;
    }

    public function __debugInfo()
    {
        return json_decode(json_encode($this), true);
    }
}

$class = new myClass();
$class->setPrivate("Baz");

print_r($class);

Https://3v4l.org/seDI6

Результат:

myClass Object
(
    [public_var] => Foobar
)
 2
Author: Lawrence Cherone, 2018-02-07 19:55:18