67.PHPアクセス制御


アクセス制御(可視性)
属性またはメソッドへのアクセス制御は、キーワードpublic(パブリック)、protected(保護された)、private(プライベート)を前に追加することによって実現される.公有として定義されたクラスメンバーは、どこでもアクセスできます.保護されたクラスメンバーとして定義されると、その子と親にアクセスできます.プライベートとして定義されたクラスメンバーは、定義されたクラスにのみアクセスできます.
属性のアクセス制御
クラス属性は、共有、保護、プライベートの1つとして定義する必要があります.varで定義すると、公有とみなされます.
Example#1属性宣言
<?php
/** * Define MyClass */
class MyClass {
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello() {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; //         
echo $obj->protected; //            
echo $obj->private; //             
$obj->printHello(); //    Public、Protected   Private


/** * Define MyClass2 */
class MyClass2 extends MyClass {
    //     public   protected      ,  private    
    protected $protected = 'Protected2';

    function printHello() {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; //         
echo $obj2->private; //     private
echo $obj2->protected; //            
$obj2->printHello(); //    Public、Protected2   Undefined

?> 
Note:        ,  PHP 4     var                PHP 5public         )。  PHP 5.1.3      ,         E_STRICT   。 

メソッドのアクセス制御
クラス内のメソッドは、共有、プライベート、または保護として定義できます.これらのキーワードが設定されていない場合、このメソッドはデフォルトで公開されます.
Example#2メソッド宣言
<?php
/** * Define MyClass */
class MyClass {
    //            
    public function __construct() { }

    //          
    public function MyPublic() { }

    //           
    protected function MyProtected() { }

    //          
    private function MyPrivate() { }

    //       
    function Foo() {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}

$myclass = new MyClass;
$myclass->MyPublic(); //         
$myclass->MyProtected(); //            
$myclass->MyPrivate(); //            
$myclass->Foo(); //   ,   ,       


/** * Define MyClass2 */
class MyClass2 extends MyClass {
    //       
    function Foo2() {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); //            
    }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); //         
$myclass2->Foo2(); //             ,      

class Bar {
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic
"
; } private function testPrivate() { echo "Bar::testPrivate
"
; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic
"
; } private function testPrivate() { echo "Foo::testPrivate
"
; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>

その他のオブジェクトへのアクセス制御
同じクラスのオブジェクトは、同じインスタンスでなくても、互いに相手のプライベートおよび保護されたメンバーにアクセスできます.これは、これらのオブジェクトの内部で具体的に実装される詳細が既知であるためである.
Example#3同じオブジェクトタイプのプライベートメンバーへのアクセス
<?php
class Test {
    private $foo;

    public function __construct($foo) {
        $this->foo = $foo;
    }

    private function bar() {
        echo 'Accessed the private method.';
    }

    public function baz(Test $other) {
        // We can change the private property:
        $other->foo = 'hello';
        var_dump($other->foo);

        // We can also call the private method:
        $other->bar();
    }
}

$test = new Test('test');

$test->baz(new Test('other'));
?> 

以上のルーチンが出力します.
string(5) "hello"
Accessed the private method.