1

私はプログラミングをしていて、この問題に遭遇しました。以下のコードサンプルでは、​​パブリック関数がプライベート変数を設定しています。これで、そのプライベート変数のコンテンツはプライベートであると予想され、$ GLOBALS変数(スーパーグローバル)がそれにアクセスでき、少なくともそれを読み取ることができると考えられます。なぜ?これを好む方法はありますか?

<?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 '</pre>';
}
?>

ありがとう、ジェフリー

4

4 に答える 4

4

privateキーワードは、プログラミングの観点から、プロパティ/メソッドがクラスの外部にアクセスされないようにすることです。サービスは機能print_rし、var_dumpそれでもそれらを見ることができます。

したがって、理由はカプセル化であり、データを文字通り隠すことではありません

于 2012-02-06T22:19:40.697 に答える
0

グローバルに何にでもアクセスできます$GLOBALSが、取得しているオブジェクト内の変数が独自のプライベート変数を持っているという事実は変わりません。

オブジェクトを単に入れるだけで$GLOBALSは、そのすべてのメンバー変数が魔法のように公開されるわけではありません。それは非常識であり、あらゆる種類のものを壊します。オブジェクトへの参照はグローバルなものであり、それ以上のものではありません。

于 2012-02-06T22:19:15.440 に答える
0

それは単に何をするかGLOBALSです。どこでどのように定義されたかに関係なく、スクリプトで現在定義されているすべての変数が含まれています。これにはプライベート変数が含まれます。

于 2012-02-06T22:20:22.653 に答える
0

のような組み込み関数はpre()、デバッグを目的print_r()var_dump()しているため、到達できるオブジェクト参照の完全な構造を表示できます。セキュリティの抜け穴?たぶん、本番環境で人々にコードを挿入させたり、これらのコマンドを使用させたりしないでください。

于 2012-08-30T13:57:12.930 に答える