Die Zugriffskontrolle von Attributen oder Methoden wird durch das voranstellen der Schlüsselwörter public, protected oder private erreicht. Auf Klassenmitglieder, die als öffentlich definiert sind, kann von überall aus zugegriffen werden. Auf ein als geschützt definiertes Klassenmitglied kann von ihm selbst und seinen Unterklassen und übergeordneten Klassen zugegriffen werden. Als privat definierte Klassenmitglieder können nur von der Klasse aufgerufen werden, in der sie definiert sind.
1. Attributzugriffskontrolle
Klassenattribute müssen als öffentlich, geschützt oder privat definiert werden. Wenn es mit var definiert ist, gilt es als öffentlich.
Beispiel #1 Eigenschaftsdeklaration
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
Hinweis: Aus Kompatibilitätsgründen ist die Methode der Verwendung des Schlüsselworts var zum Definieren von Variablen in PHP 4 in PHP 5 weiterhin gültig (genau wie ein öffentliches Schlüsselwort und ein Alias). ). In Versionen vor PHP 5.1.3 erzeugte diese Syntax eine E_STRICT-Warnung.
Methodenzugriffskontrolle
Methoden in einer Klasse können als öffentlich, privat oder geschützt definiert werden. Wenn diese Schlüsselwörter nicht festgelegt sind, ist die Methode standardmäßig öffentlich.
Beispiel #2 Methodendeklaration
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
Zugriffskontrolle anderer Objekte
Objekte derselben Klasse können auf die privaten und geschützten Mitglieder der anderen Klasse zugreifen, auch wenn sie nicht dieselbe Instanz sind. Dies liegt daran, dass die internen Implementierungsdetails dieser Objekte bekannt sind.
Beispiel #3 Zugriff auf private Mitglieder desselben Objekttyps
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'));
Ausgabeergebnis:
string(4) "test"
Zugriff auf die private Methode.