>백엔드 개발 >PHP 튜토리얼 >PHP 객체 지향 구문 4: 액세스 수정 한정자, 공개, 보호, 비공개

PHP 객체 지향 구문 4: 액세스 수정 한정자, 공개, 보호, 비공개

黄舟
黄舟원래의
2016-12-28 10:15:021779검색

액세스 수정 한정자:
멤버(속성, 메서드)에 액세스할 수 있는 위치를 설명하는 데 사용됩니다!

팁:
PHP는 클래스 개념을 사용하여 멤버에 대한 액세스를 제한합니다!
PHP는 액세스된 코드를 클래스 내부, 클래스 외부, 상속 체인 클래스 내부의 세 가지 주요 영역으로 나눕니다!

은 다음을 기반으로 합니다.
대상 멤버가 정의된 위치와 대상 멤버가 액세스되는 위치(현재 액세스 참조 -> 특성/메서드의 코드가 실행되는 위치)가 범위 내에 있는지 확인합니다. 클래스 외부 또는 체인 카테고리 내에서 상속됩니다!

<?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. 일반적으로 다시 쓰기가 발생하면 다시 쓰기 후의 정의 위치가 우선합니다.
(이 클래스 내에서 액세스할 때 전용 속성을 재정의할 수 없다는 점은 예외입니다.)

<?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: 액세스 수정 한정자, 공개, 보호, 비공개 콘텐츠입니다. 자세한 내용은 PHP 중국어 웹사이트(www. php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.