Zugriffsänderungsqualifikationsmerkmal:
Wird verwendet, um zu beschreiben, wo auf ein Mitglied (Eigenschaft, Methode) zugegriffen werden kann!
Tipp:
PHP nutzt das Konzept von Klassen, um den Zugriff auf Mitglieder zu beschränken!
PHP unterteilt den Code, auf den zugegriffen wird, in drei Hauptbereiche: innerhalb der Klasse, außerhalb der Klasse und innerhalb der Vererbungskettenklasse!
basiert auf:
Wo das Zielmitglied definiert ist und wo auf das Zielmitglied zugegriffen wird (siehe den aktuellen Zugriff -> wo der Code des Attributs/der Methode ausgeführt wird), um festzustellen, ob es darin enthalten ist die Klasse, außerhalb der Klasse oder innerhalb der Kettenkategorie geerbt!
<?php class A{ public function iam_a(){ var_dump($this->property); } } class B extends A{ //在B类中定义 public $property='phpphphp'; public function iam_b(){ var_dump($this->property); } } class C extends B{ public function iam_c(){ var_dump($this->property); } } /*public $property='phpphphp';公共的,指的是,成员在本类内,继承链上的类内,与类外,都可以被访问!*/ //明确目标成员$property是在B类中定义的。 $c=new C; // $c->property;在B类外执行,可以访问到 echo $c->property; echo '<hr/>'; // iam_c()中的$this->property是在B类的继承链内,可以访问到 $c->iam_c(); // iam_b()中的$this->property是在B类内,可以访问到 $c->iam_b(); //iam_a()中的$this->property是在B类的继承链内,可以访问到 $c->iam_a();
运行结果: string(8) "phpphphp" string(8) "phpphphp" string(8) "phpphphp" string(8) "phpphphp"
protected $property='phpphphp';
Geschützt bedeutet, dass Mitglieder innerhalb dieser Klasse sind und in Klassen in der Vererbungskette (Unterklasse, übergeordnete Klasse) verwendet werden können
$c=new C; // $c->property;在B类外执行,不能访问到 var_dump($c->property); // iam_c()中的$this->property是在B类的继承链内,可以访问到 $c->iam_c(); // iam_b()中的$this->property是在B类内,可以访问到 $c->iam_b(); //iam_a()中的$this->property是在B类的继承链内,可以访问到 $c->iam_a();
运行结果: PHP Fatal error: Cannot access protected property C::$property in /usercode/file.php on line 25
private $property='phpphphp'
Private bedeutet, dass nur innerhalb dieser Klasse zugegriffen werden kann!
$c=new C; // $c->property;在B类外执行,不能访问到 var_dump($c->property); // iam_c()中的$this->property是在B类的继承链内,不能访问到 $c->iam_c(); // iam_b()中的$this->property是在B类内,可以访问到 $c->iam_b(); //iam_a()中的$this->property是在B类的继承链内,不能访问到 $c->iam_a();
运行结果: NULL NULL string(8) "phpphphp" NULL PHP Notice: Undefined property: C::$property in /usercode/file.php on line 25 PHP Notice: Undefined property: C::$property in /usercode/file.php on line 19 PHP Notice: Undefined property: C::$property in /usercode/file.php on line 4
So wählen Sie aus:
Ein Prinzip besteht darin, zu versuchen, die Kapselung widerzuspiegeln. Kapselung bezieht sich darauf, die interne Implementierung so weit wie möglich zu verbergen und nur externe Betriebsschnittstellen zu entwickeln! Syntaktisch bedeutet dies, dass die Eigenschaften und Methoden privatisiert (geschützt) werden, die nicht für die externe Verwendung benötigt werden, sodass nur einige notwendige öffentliche Methoden übrig bleiben!
Eine Klasse verfügt über mindestens eine öffentliche Methode, die außerhalb der Klasse aufgerufen werden kann.
Wenn eine Klasse nicht vererbt werden soll, können Mitglieder privat sein. Wenn eine Klasse als Basisklasse verwendet wird und für die Vererbung durch Unterklassen konzipiert ist, sind einige Mitglieder geschützt. Es kommt immer noch auf die spezifischen Geschäftsanforderungen an.
Tipp:
1. Wenn ein Umschreiben erfolgt, hat im Allgemeinen die Definitionsposition nach dem Umschreiben Vorrang.
(Die Ausnahme besteht darin, dass private Eigenschaften nicht überschrieben werden können, wenn innerhalb dieser Klasse darauf zugegriffen wird.)
<?php class A{ public function iam_a(){ var_dump($this->property); } } class B extends A{ //在B类中定义public $property public $property='phpphphp'; public function iam_b(){ var_dump($this->property); } } class C extends B{ //C类定义了同名属性 public $property='chongxiechongxiechongxie'; public function iam_c(){ var_dump($this->property); } } $c=new C; echo $c->property; echo '<hr/>'; //确定了下面三个方法中$this都是C类对象,先查找C类中有没有定义property属性,如果没有,再往父类找。 $c->iam_c(); $c->iam_b(); $c->iam_a();
运行结果: chongxiechongxiechongxie string(24) "chongxiechongxiechongxie" string(24) "chongxiechongxiechongxie" string(24) "chongxiechongxiechongxie"
Hinweis: Beim Überschreiben von Attributen oder Methoden der übergeordneten Klasse muss der Zugriffskontrollmodifikator sein Schwächer als die gleichnamige Eigenschaft oder Methode der übergeordneten Klasse. Privat ist am stärksten und öffentlich ist am schwächsten.
Ausnahme:
Private Eigenschaften können nicht überschrieben werden, wenn innerhalb dieser Klasse darauf zugegriffen wird.
<?php class A{ public function iam_a(){ echo '在继承链内访问<br/>'; var_dump($this); var_dump($this->property); echo '<hr/>'; } } class B extends A{ //在B类中定义private $property private $property='phpphphp'; public function iam_b(){ echo '类内访问<br/>'; var_dump($this); var_dump($this->property); echo '<hr/>'; } } class C extends B{ //在C类中定义同名属性 public $property='chongxiechongxiechongxie'; public function iam_c(){ echo '在继承链内访问<br/>'; var_dump($this); var_dump($this->property); echo '<hr/>'; } } $c=new C; echo '在类外访问'.$c->property;//在类外访问 echo '<hr/>'; $c->iam_c();//在继承链内访问 $c->iam_b();//在B类内访问 $c->iam_a();//在继承链内访问
运行结果: 在类外访问chongxiechongxiechongxie 在继承链内访问string(24) "chongxiechongxiechongxie" object(C)#1 (2) { ["property"]=> string(24) "chongxiechongxiechongxie" ["property":"B":private]=> string(8) "phpphphp" } string(24) "chongxiechongxiechongxie" 类内访问,不能被重写,string(8) "phpphphp" 如果有知道原因的同学,请留个言解答下,谢谢 object(C)#1 (2) { ["property"]=> string(24) "chongxiechongxiechongxie" ["property":"B":private]=> string(8) "phpphphp" } string(8) "phpphphp" 在继承链内访问string(24) "chongxiechongxiechongxie" object(C)#1 (2) { ["property"]=> string(24) "chongxiechongxiechongxie" ["property":"B":private]=> string(8) "phpphphp" } string(24) "chongxiechongxiechongxie"
Das Obige ist die objektorientierte PHP-Syntax 4: Zugriffsänderungsqualifikationsmerkmal, öffentlicher, geschützter, privater Inhalt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.org). php.cn)!