Qualificateur de modification d'accès :
Utilisé pour décrire où un membre (propriété, méthode) est accessible !
astuce :
PHP utilise le concept de classes pour restreindre l'accès aux membres !
PHP divise le code accessible en trois zones principales : au sein de la classe, en dehors de la classe et au sein de la classe de chaîne d'héritage !
se base sur :
L'endroit où le membre cible est défini et l'endroit où on accède au membre cible (voir l'accès actuel -> où le code de l'attribut/de la méthode est exécuté) pour déterminer s'il est dans la classe, en dehors de la classe ou héritée Dans la catégorie chaîne !
<?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';
Protected signifie que les membres sont dans cette classe et peuvent être utilisés dans les classes de la chaîne d'héritage (sous-classe, classe parent) Consulté
$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'
Privé signifie que seul l'intérieur de cette classe est accessible !
$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
Comment choisir :
Un principe, essayer de refléter l'encapsulation. L'encapsulation fait référence au fait de cacher autant que possible l'implémentation interne et de développer uniquement des interfaces d'opération externes ! Syntaxiquement, c'est-à-dire privatiser (protéger) les propriétés et les méthodes qui ne sont pas nécessaires à un usage externe, en ne laissant que quelques méthodes publiques nécessaires !
Une classe possède au moins une méthode publique qui peut être appelée en dehors de la classe.
Si une classe n'est pas destinée à être héritée, les membres peuvent être privés. Si une classe est utilisée comme classe de base et est conçue pour être héritée par des sous-classes, certains membres seront protégés. Cela dépend toujours des exigences spécifiques de l’entreprise.
astuce :
1. Généralement, si une réécriture se produit, la position de définition après la réécriture prévaudra.
(L'exception est que les propriétés privées ne peuvent pas être remplacées lors d'un accès dans cette classe.)
<?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"
Remarque : lors du remplacement d'attributs ou de méthodes de la classe parent, le modificateur de contrôle d'accès doit être Plus faible que la propriété ou la méthode du même nom de la classe parent. Le privé est le plus fort et le public le plus faible.
Exception :
Les propriétés privées ne peuvent pas être remplacées lorsqu'elles sont accessibles dans cette classe.
<?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"
Ce qui précède est la syntaxe orientée objet PHP 4 : qualificatif de modification d'accès, contenu public, protégé, privé Pour plus de contenu connexe, veuillez faire attention au site Web chinois PHP (www. php.cn) !