アクセス権

プロパティまたはメソッドのアクセス権(visibility)は、 キーワード: public, protected または privateを指定することにより、 定義できます。 publicとして定義されたアイテムには、どこからでもアクセス可能です。 protectedは、派生クラスや親クラス(とそれを定義するクラス自体)にアクセスを 制限します。privateは、それを定義するクラスのみにアクセス権を 制限します。

メンバのアクセス権

クラスのメンバは、public, private, または protectedとして 定義されなくてはなりません。

例 19-9. メンバの宣言

<?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; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
    
// We can redeclare the public and protected method, but not private
    
protected $protected = 'Protected2';

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

$obj2 = new MyClass2();
echo
$obj->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, not Private

?>

注意: キーワードvarで変数を宣言する PHP 4の方法は、PHP 5オブジェクトではもはや 有効ではありません。 互換性のためにPHPで宣言された変数は、publicのアクセス権を 有していると仮定されますが、 E_STRICT警告が発生します。

メソッドのアクセス権

クラスメソッドは、public, private, または protectedとして 定義される必要があります。どの宣言も有さないメソッドは、 publicとして定義されます。

例 19-10. メソッドの宣言

<?php
/**
* Define MyClass
*/
class MyClass
{
    
// Contructors must be public
    
public function __construct() { }

    
// Declare a public method
    
public function MyPublic() { }

    
// Declare a protected method
    
protected function MyProtected() { }

    
// Declare a private method
    
private function MyPrivate() { }

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

$myclass = new MyClass;
$myclass->MyPublic(); // Works
$myclass->MyProtected(); // Fatal Error
$myclass->MyPrivate(); // Fatal Error
$myclass->Foo(); // Public, Protected and Private work


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

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Works
$myclass2->Foo2(); // Public and Protected work, not Private
?>