アクセス権
プロパティ、メソッドまたは (PHP 7.1.0 以降) 定数のアクセス権 (visibility) は、 キーワード: public, protected または private を指定することにより定義できます。 public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。 protected 宣言されたメンバーには、 そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。 private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。
プロパティのアクセス権
クラスのプロパティは、public, private, または protected として定義しなくてはなりません。var を使って宣言した場合、 そのプロパティは 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 を表示します?>
注意:
キーワード var で変数を宣言する PHP 4 の方法は、互換性を保つために今でもサポートされています (これは public と同じ扱いになります)。PHP 5.1.3 より前では、 これを使用すると
E_STRICT
警告が発生します。
メソッドのアクセス権
クラスメソッドは、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 メンバーへのアクセス
<?phpclass 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.