ホームページ >バックエンド開発 >PHPチュートリアル >PHP オブジェクト指向構文 4: アクセス変更修飾子、public、protected、private

PHP オブジェクト指向構文 4: アクセス変更修飾子、public、protected、private

黄舟
黄舟オリジナル
2016-12-28 10:15:021779ブラウズ

アクセス修飾子修飾子:
メンバー (プロパティ、メソッド) にアクセスできる場所を記述するために使用されます。

ヒント:
PHP はクラスの概念を使用してメンバーへのアクセスを制限します。
PHP は、アクセスされるコードを 3 つの主要な領域 (クラス内、クラス外、継承チェーン クラス内) に分割します。

それは以下に基づいて決定されます:
ターゲットメンバーが定義されている場所とターゲットメンバーがアクセスされる場所(現在のアクセスを参照 -> 属性/メソッドのコードが実行される場所を参照)により、それがクラス内にあるか、クラス外にあるかが決定されます。クラスまたは継承チェーン クラス内で!

<?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();
运行结果:
string(8) "phpphphp"
string(8) "phpphphp"
string(8) "phpphphp"
string(8) "phpphphp"

protected $property='phpphphp';
Protected は、このクラス内および継承チェーン上のクラス (サブクラス、親クラス) でメンバーにアクセスできることを意味します

$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 は、それのみを意味しますこのクラス内でアクセスできます。

$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

選択方法:
1 つの原則は、カプセル化を反映するように努めることです。カプセル化とは、内部実装を可能な限り隠し、外部操作インターフェイスのみを開発することを意味します。つまり、構文的には、外部使用に必要のないプロパティとメソッドをプライベート化 (保護) し、必要なパブリック メソッドの一部だけを残します。
クラスには、クラス外で呼び出すことができるパブリック メソッドが少なくとも 1 つあります。
クラスが継承されることを意図していない場合、メンバーはプライベートにすることができます。クラスが基本クラスとして使用され、サブクラスによって継承されるように設計されている場合、一部のメンバーは保護されます。それは依然として特定のビジネス要件によって異なります。

ヒント:
1. 通常、書き換えが発生した場合は、書き換え後の定義位置が優先されます。
(例外は、このクラス内でアクセスする場合、プライベート プロパティをオーバーライドできないことです。)

<?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();
运行结果:
chongxiechongxiechongxie
string(24) "chongxiechongxiechongxie"
string(24) "chongxiechongxiechongxie"
string(24) "chongxiechongxiechongxie"

注: 親クラスのプロパティまたはメソッドをオーバーライドする場合、アクセス制御修飾子は、親クラスの同じ名前のプロパティまたはメソッドよりも弱い必要があります。親クラス。私立が最強で公立が最弱。

例外:
このクラス内でアクセスする場合、プライベート プロパティをオーバーライドすることはできません。

<?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();//在继承链内访问
运行结果:
在类外访问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"

上記は、PHP オブジェクト指向構文 4: アクセス変更修飾子、public、protected、private の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。