プロパティまたはメソッドのアクセス制御は、キーワード public、protected、または private を先頭に追加することで実現されます。 public として定義されたクラス メンバーにはどこからでもアクセスできます。 protected として定義されたクラス メンバーは、それ自体、そのサブクラス、およびその親クラスからアクセスできます。プライベートとして定義されたクラス メンバーには、そのメンバーが定義されているクラスのみがアクセスできます。
1. 属性アクセス制御
クラス属性は、public、protected、および private のいずれかとして定義する必要があります。 var で定義されている場合は、パブリックとみなされます。
例 #1 プロパティ宣言
class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public.'<br>'; echo $this->protected.'<br>'; echo $this->private.'<br>'; } } $obj = new MyClass(); echo $obj->public; //这行可以正常运行 echo $obj->protected; //这行会产生一个致命错误 echo $obj->private; //这行也会产生一个致命错误 $obj->printHello(); //正常输出public、protected、private的值 class MyClass2 extends MyClass { 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、Protected和Undefined
注: 互換性の理由から、PHP 4 で var キーワードを使用して変数を定義する方法は、PHP 5 でも引き続き有効です (public キーワードのエイリアスとしてのみ)。 PHP 5.1.3 より前のバージョンでは、この構文により E_STRICT 警告が生成されました。
メソッド アクセス制御
クラス内のメソッドは、パブリック、プライベート、または保護として定義できます。これらのキーワードが設定されていない場合、メソッドはデフォルトで public になります。
例 #2 メソッド宣言
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(); //公有,受保护,私有都可以执行 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<br>"; } private function testPrivate(){ echo "Bar::testPrivate<br>"; } } class Foo extends Bar { public function testPublic(){ echo "Foo::testPublic<br>"; } public function testPrivate(){ echo "Foo::testPrivate<br>"; } } $myFoo = new Foo(); $myFoo -> test(); //Bar::testPrivate //Foo::testPublic
他のオブジェクトのアクセス制御
同じクラスのオブジェクトは、同じインスタンスでなくても、互いのプライベート メンバーと保護されたメンバーにアクセスできます。これは、これらのオブジェクトの内部実装の詳細がわかっているためです。
例 #3 同じオブジェクト型のプライベート メンバーにアクセスする
class Test { private $foo; public function __construct($foo) { $this->foo = $foo; } private function bar() { echo "Accessed the private method."; } public function baz(Test $other) { //我们可以在这里改变私有属性的值 $other->foo = 'hello'; var_dump($this->foo); //我们也可以在这里调用私有的方法 $other->bar(); } } $test = new Test('test'); $test -> baz(new Test('other'));
出力結果:
string(4) "test"
プライベート メソッドにアクセスしました。