アクセス権

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

メンバのアクセス権

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

例 19-10. メンバの宣言

<?php
/**
* 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 ; // Fatal エラー
echo $obj -> private ; // Fatal エラー
$obj -> printHello (); // Public、Protected そして Private を表示します


/**
* 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
$obj -> public ; // 動作します
echo $obj2 -> private ; // 未定義です
echo $obj2 -> protected ; // Fatal エラー
$obj2 -> printHello (); // Public、Protected2 を表示しますが Private は表示しません

?>

注意: キーワード var で変数を宣言する PHP 4 の方法は、互換性を保つために今でもサポートされています (これは public と同じ扱いになります)。PHP 5.1.3 より前では、 これを使用すると E_STRICT 警告が発生します。

メソッドのアクセス権

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

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

<?php
/**
* MyClass の定義
*/
class MyClass
{
    
// コンストラクタは public でなければなりません
    
public function __construct () { }

    
// public メソッドの宣言
    
public function MyPublic () { }

    
// protected メソッドの宣言
    
protected function MyProtected () { }

    
// private メソッドの宣言
    
private function MyPrivate () { }

    
// これは public となります
    
function Foo ()
    {
        
$this -> MyPublic ();
        
$this -> MyProtected ();
        
$this -> MyPrivate ();
    }
}

$myclass = new MyClass ;
$myclass -> MyPublic (); // 動作します
$myclass -> MyProtected (); // Fatal エラー
$myclass -> MyPrivate (); // Fatal エラー
$myclass -> Foo (); // Public、Protected および Private が動作します


/**
* MyClass2 の定義
*/
class MyClass2 extends MyClass
{
    
// これは public となります
    
function Foo2 ()
    {
        
$this -> MyPublic ();
        
$this -> MyProtected ();
        
$this -> MyPrivate (); // Fatal エラー
    
}
}

$myclass2 = new MyClass2 ;
$myclass2 -> MyPublic (); // 動作します
$myclass2 -> Foo2 (); // Public および Protected は動作しますが、Private は動作しません
?>