アクセス権

プロパティ、メソッドまたは (PHP 7.1.0 以降) 定数のアクセス権 (visibility) は、 キーワード: public, protected または private を指定することにより定義できます。 public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。 protected 宣言されたメンバーには、 そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。 private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。

プロパティのアクセス権

クラスのプロパティは、public, private, または protected として定義することができます。 アクセス権を明示的に指定しない場合、 そのプロパティは public として定義されます。

例1 プロパティの宣言

<?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 はできません。
    
public $public 'Public2';
    protected 
$protected 'Protected2';

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

$obj2 = new MyClass2();
echo 
$obj2->public// 動作します
echo $obj2->protected// Fatal エラー
echo $obj2->private// 未定義です
$obj2->printHello(); // Public2, Protected2, Undefined を表示します

?>

メソッドのアクセス権

クラスメソッドは、public, private, または protected として定義します。アクセス権を明示せずに宣言したメソッドは、 public となります。

例2 メソッドの宣言

<?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 は動作しません

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

    public function 
testPublic() {
        echo 
"Bar::testPublic\n";
    }
    
    private function 
testPrivate() {
        echo 
"Bar::testPrivate\n";
    }
}

class 
Foo extends Bar 
{
    public function 
testPublic() {
        echo 
"Foo::testPublic\n";
    }
    
    private function 
testPrivate() {
        echo 
"Foo::testPrivate\n";
    }
}

$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic
?>

定数のアクセス権

PHP 7.1.0 以降では、クラスの定数は public, private, protected として定義できるようになりました。 明示的に公開範囲のキーワードを明示的に宣言しない定数は、public として定義されます。

例3 PHP 7.1.0 以降での定数の宣言

<?php
/**
 * MyClass を定義する
 */
class MyClass
{
    
// public な定数を宣言する
    
public const MY_PUBLIC 'public';

    
// protected な定数を宣言する
    
protected const MY_PROTECTED 'protected';

    
// private な定数を宣言する
    
private const MY_PRIVATE 'private';

    public function 
foo()
    {
        echo 
self::MY_PUBLIC;
        echo 
self::MY_PROTECTED;
        echo 
self::MY_PRIVATE;
    }
}

$myclass = new MyClass();
MyClass::MY_PUBLIC// 動作します
MyClass::MY_PROTECTED// Fatal エラー
MyClass::MY_PRIVATE// Fatal エラー
$myclass->foo(); // Public, Protected, Private のいずれでも動作します


/**
 * MyClass2 を定義する
 */
class MyClass2 extends MyClass
{
    
// これは public
    
function foo2()
    {
        echo 
self::MY_PUBLIC;
        echo 
self::MY_PROTECTED;
        echo 
self::MY_PRIVATE// Fatal エラー
    
}
}

$myclass2 = new MyClass2;
echo 
MyClass2::MY_PUBLIC// 動作します
$myclass2->foo2(); // Public, Protected では動作しますが、Private では動作しません
?>

他のオブジェクトからのアクセス権

同じ型のオブジェクト間では、たとえ同一のインスタンスでなくても お互いの private メンバーや protected メンバーにアクセスすることができます。 これは、そのオブジェクトの内部ではオブジェクトの実装の詳細が既知であるからです。

例4 同じ型のオブジェクトの private メンバーへのアクセス

<?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)
    {
        
// private プロパティを変更することができます
        
$other->foo 'hello';
        
var_dump($other->foo);

        
// private メソッドをコールすることもできます
        
$other->bar();
    }
}

$test = new Test('test');

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

上の例の出力は以下となります。

string(5) "hello"
Accessed the private method.