Heim > Backend-Entwicklung > PHP-Tutorial > Objektorientierte PHP-Syntax 4: Zugriffsänderungsqualifikationsmerkmal, öffentlich, geschützt, privat

Objektorientierte PHP-Syntax 4: Zugriffsänderungsqualifikationsmerkmal, öffentlich, geschützt, privat

黄舟
Freigeben: 2023-03-04 11:56:01
Original
1754 Leute haben es durchsucht

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=&#39;phpphphp&#39;;
    public function iam_b(){
        var_dump($this->property);
    }
}
class C extends B{
    public function iam_c(){
            var_dump($this->property);
    }
}
/*public $property=&#39;phpphphp&#39;;公共的,指的是,成员在本类内,继承链上的类内,与类外,都可以被访问!*/
//明确目标成员$property是在B类中定义的。
$c=new C;
// $c->property;在B类外执行,可以访问到
echo $c->property;
echo &#39;<hr/>&#39;;
// iam_c()中的$this->property是在B类的继承链内,可以访问到
$c->iam_c();
// iam_b()中的$this->property是在B类内,可以访问到
$c->iam_b();
//iam_a()中的$this->property是在B类的继承链内,可以访问到
$c->iam_a();
Nach dem Login kopieren
运行结果:
string(8) "phpphphp"
string(8) "phpphphp"
string(8) "phpphphp"
string(8) "phpphphp"
Nach dem Login kopieren

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();
Nach dem Login kopieren
运行结果:
PHP Fatal error: Cannot access protected property C::$property in /usercode/file.php on line 25
Nach dem Login kopieren

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();
Nach dem Login kopieren
运行结果:
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
Nach dem Login kopieren

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=&#39;phpphphp&#39;;
    public function iam_b(){
            var_dump($this->property);
    }
}
class C extends B{
//C类定义了同名属性
    public $property=&#39;chongxiechongxiechongxie&#39;;
    public function iam_c(){
            var_dump($this->property);
    }
}
$c=new C;
echo $c->property;
echo &#39;<hr/>&#39;;
//确定了下面三个方法中$this都是C类对象,先查找C类中有没有定义property属性,如果没有,再往父类找。
$c->iam_c();
$c->iam_b();
$c->iam_a();
Nach dem Login kopieren
运行结果:
chongxiechongxiechongxie
string(24) "chongxiechongxiechongxie"
string(24) "chongxiechongxiechongxie"
string(24) "chongxiechongxiechongxie"
Nach dem Login kopieren

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 &#39;在继承链内访问<br/>&#39;;
            var_dump($this);
            var_dump($this->property);
            echo &#39;<hr/>&#39;;
    } 
}
class B extends A{
    //在B类中定义private $property
    private $property=&#39;phpphphp&#39;;
    public function iam_b(){
        echo &#39;类内访问<br/>&#39;;
            var_dump($this);
            var_dump($this->property);
            echo &#39;<hr/>&#39;;
    }
}
class C extends B{
//在C类中定义同名属性
    public $property=&#39;chongxiechongxiechongxie&#39;;
    public function iam_c(){
            echo &#39;在继承链内访问<br/>&#39;;
            var_dump($this);
            var_dump($this->property);
            echo &#39;<hr/>&#39;;
    }
}
$c=new C;
echo &#39;在类外访问&#39;.$c->property;//在类外访问
echo &#39;<hr/>&#39;;
$c->iam_c();//在继承链内访问
$c->iam_b();//在B类内访问
$c->iam_a();//在继承链内访问
Nach dem Login kopieren
运行结果:
在类外访问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"
Nach dem Login kopieren

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)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage