Почему приватный класс PHP var не является приватным? - PullRequest
1 голос
/ 07 февраля 2012

Я занимался программированием и столкнулся с этой проблемой: в приведенном ниже примере кода открытая функция задает частную переменную.Теперь можно было бы ожидать, что содержимое этой закрытой переменной является личным, хотя переменная $ GLOBALS (суперглобальная) может получить к ней доступ и, по крайней мере, прочитать ее.Зачем?есть ли способ это сделать?

<code><?PHP
error_reporting( E_ALL );

class test {
    private $test = '';

    public function test()
    {
        $this->test = 'Can u see me?'; 
    }
}

$b = new test();
$b->test();

pre( $GLOBALS['b'] );
// Result:
// test Object
// (
//     [test:test:private] => Can u see me?
// )

somefunc();
function somefunc()
{
    pre( $GLOBALS['b'] );
    // Result:
    // test Object
    // (
    //     [test:test:private] => Can u see me?
    // )
}

echo $b->test;
// Result:
// Fatal error: Cannot access private property test::$test

function pre( $a ) {
    echo '<pre>';
    print_r( $a );
    echo '
';}?>

Спасибо, Джеффри

Ответы [ 4 ]

4 голосов
/ 07 февраля 2012
Ключевое слово

private предназначено для предотвращения доступа к свойству / методу вне класса с точки зрения программирования.Сервисные функции print_r и var_dump все еще могут их видеть.

Таким образом, причина в инкапсуляции , а не в буквальном смысле, скрывая данные

0 голосов
/ 30 августа 2012

Встроенные функции, такие как pre(), print_r() и var_dump(), предназначены для целей отладки и, следовательно, могут показать вам полную структуру любой ссылки на объект, которой он может достичь. Лазейка в безопасности? Возможно, просто не позволяйте людям вводить код или использовать эти команды в производственной среде.

0 голосов
/ 07 февраля 2012

Это просто то, что делает GLOBALS.В нем есть все переменные, которые в настоящий момент определены в скрипте, независимо от того, где и как они были определены.Это включает в себя частные переменные.

0 голосов
/ 07 февраля 2012

Вы можете получить доступ ко всему в $GLOBALS в глобальном масштабе, но это не меняет того факта, что переменная в объекте, к которому вы обращаетесь, имеет свои собственные частные переменные.

Простое помещение объекта в $GLOBALS волшебным образом не делает все его переменные-члены открытыми. Это было бы безумием и сломало бы все виды вещей. Ссылка на объект - это то, что является глобальным, не более того.

...