다음은 기사 전문입니다.
1. Encapsulation
Encapsulation은 추출된 데이터와 해당 데이터에 대한 연산을 함께 캡슐화하는 것입니다. . 내부적으로 보호되며 프로그램의 다른 부분에서 승인된 작업(메서드)만 데이터에 대해 작업할 수 있습니다.
php는 세 가지 액세스 제어 수정자를 제공합니다.
public은 전역, 이 클래스 내부, 클래스 외부 및 하위 클래스에 액세스할 수 있음을 의미합니다.
protected는 보호됨을 의미합니다. 이 클래스 또는 하위 클래스만 가능합니다. access
private은 private을 의미하며 이 클래스 내에서만 액세스할 수 있습니다.
위 세 가지 수식자는 메소드와 속성(변수)을 모두 수정할 수 있습니다. 메소드가 없는 경우 액세스 수식자는 기본적으로 public으로 설정됩니다. 및 멤버 속성은 액세스 한정자를 지정해야 합니다. PHP4에는 공개 속성을 의미하는 var $name을 작성하는 방법도 있습니다.
예:
<?php class Person{ public $name; protected $age; private $salary; function __construct($name,$age,$salary){ $this->name=$name; $this->age=$age; $this->salary=$salary; } public function showinfo(){ //这表示三个修饰符都可以在本类内部使用 echo $this->name."||".$this->age."||".$this->salary; } } $p1=new Person('张三',20,3000); //这里属于类外部,那么如果用下面的方法访问age和salary都会报错 // echo $p1->age; echo$p1->salary; ?>
그럼 외부에서 보호된 요소와 비공개 요소 및 메서드에 액세스하려면 어떻게 해야 하나요?
일반적인 접근 방식은 공개 함수를 통해 이러한 변수 형식에 액세스하는 것입니다.
public function setxxxx($val){ $this->xxxx=$val; } public function getxxxx(){ return $this->xxxx; }
여기서 설정하고 가져오는 것은 식별의 편의를 위한 것일 뿐 필수는 아닙니다.
예:
public function getsalary(){ return $this->salary; //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问 }
외부적으로 echo $p1->getsalary();를 사용할 수 있습니다.
보호되고 비공개로 액세스하려면 다음 방법을 사용할 수도 있지만 권장되지 않습니다. , 그냥 이해하세요
__set() 및 __get()
__set()은 보호 속성 또는 비공개 속성에 값을 할당합니다
__set($name,$val);
__get()은
__get($name)
예:
<?php class testa{ protected $name; //使用__set()来管理所有属性 public function __set($pro_name,$pro_val){ //上面$pro_name和$pro_val可自定义 //下面$this->pro_name为既定,不可更改 $this->pro_name=$pro_val; } //使用__get()来获取所有属性值 public function __get($pro_name){ if(isset($pro_name)){ return $this->pro_name; } else { return null; } } } $n1=new testa(); //正常情况,类外部是不能访问protected属性的, 但是用了上面的方法就可以对它们进行操作 $n1->name='小三'; echo $n1->name; ?>
2. 상속
먼저 예시를 살펴보겠습니다:
<?php class Pupil{ public $name; protected $age; public function getinfo(){ echo $this->name.'||'.$this->age; } public function testing(){ echo 'this is pupil'; } } class Graduate{ public $name; protected $age; public function getinfo(){ echo $this->name.'||'.$this->age; } public function testing(){ echo 'this is Graduate'; } } ?>
위 예시에서 볼 수 있듯이, 여러 클래스가 공통 속성과 메소드를 많이 가질 경우,
코드 재사용성이 높지 않고 코드가 중복되는 경우 CSS에서 처리하는 방법을 생각해 보세요
해결 방법: 상속
<?php class Students{ public $name; public $age; public function __construct($name,$age){ $this->name=$name; $this->age=$age; } public function showinfo(){ echo $this->name.'||'.$this->age; } } class Pupil extends Students{ function testing(){ echo 'Pupil '.$this->name.' is testing'; } } class Graduate extends Students{ function testing(){ echo 'Graduate '.$this->name.' is testing'; } } $stu1=new Pupil('张三',20); $stu1->showinfo(); echo '<br/>'; $stu1->testing(); ?>
위에서 알 수 있듯이 상속은 하위 클래스(Subclass)입니다. )는 상위 클래스를 확장합니다
클래스(BaseClass)의 공개 및 보호 속성과 메소드는 계속됩니다.
비공개 속성과 메소드를 상속할 수 없습니다.
구문 구조:
class 父类名{} class 子类名 extends 父类名{}
세부 정보:
1. 하위 클래스는 하나의 상위 클래스만 상속할 수 있습니다(여기서는 직접 상속을 나타냄). 여러 클래스,
는 여러 레이어를 사용할 수 있습니다. 상속
예:
<?php class A{ public $name='AAA'; } class B extends A{ public $age=30; } class C extends B{} $p=new C(); echo $p->name;//这里会输出AAA ?>
2. 하위 클래스 객체를 생성할 때 해당 상위 클래스의 생성자는 기본적으로 자동으로 호출되지 않습니다.
예:
class A{ public function __construct(){ echo 'A'; } } class B extends A{ public function __construct(){ echo 'B'; } } $b=new B();//这里会优先输出B中的构造方法,
B에 생성자 메소드가 없으면 A의
가 출력됩니다. 3. 상위 클래스의 메소드에 액세스해야 하는 경우. 하위 클래스에서(생성자 메서드 및 멤버 메서드의 수정자는 protected 또는 private입니다)
그런 다음 상위 클래스:: 메서드 이름 또는 parent:: 메서드 이름을 사용하여
여기에서 완료할 수 있습니다. parent와 앞서 언급한 self는 모두 소문자이며, 대문자로 하면 오류가 보고됩니다.]
class A{ public function test(){ echo 'a_test'; } } class B extends A{ public function __construct(){ //两种方法都行 A::test(); parent::test(); } } $b=new B();
5. 하위 클래스(파생 클래스)의 메소드가 상위 클래스의 메소드와 완전히 동일한 경우( 공개, 보호),
이를 메서드 재정의 또는 메서드 재정의(override)라고 합니다. 아래를 참조하세요 다형성
3. 다형성
예:
<?php class Animal{ public $name; public $price; function cry(){ echo 'i don\'t know'; } } class Dog extends Animal{ //覆盖、重写 function cry(){ echo 'Wang Wang!'; Animal::cry();//这里不会报错,能正确执行父类的cry(); } } $dog1=new Dog(); $dog1->cry(); ?>
요약:
1. 상위 클래스가 모든 하위 클래스에 메서드가 있다는 것을 알고 있지만 상위 클래스가 메서드 작성 방법을 결정할 수 없는 경우 하위 클래스가 해당 메서드를 덮어쓰도록 할 수 있습니다. 하위 클래스의 메서드 이름과 매개 변수 수가 정확히 동일해야 합니다.
2. 하위 클래스가 상위 클래스(보호/공용)의 메서드를 호출하려는 경우 상위 클래스 이름을 사용할 수 있습니다. :메서드 이름 또는 부모::메서드 이름
3. 메소드 재작성을 구현할 때 액세스 한정자는 다를 수 있지만 하위 클래스 메소드의 액세스 권한은 해당 메소드의 액세스 권한보다 크거나 같아야 합니다. 상위 클래스 메서드(즉, 상위 클래스 메서드의 액세스 권한을 줄일 수 없음)
예를 들어 상위 클래스 공용 함수 cry( ){} 하위 클래스 보호 함수 cry(){}는 오류를 보고합니다.
그러나 하위 클래스의 액세스 권한은 다음과 같이 확장될 수 있습니다:
父类private function cry(){} 子类 protected function cry(){} 可以正确执行
위는 (고급) PHP 객체 지향 3가지 주요 기능(캡슐화, 상속, 다형성)에 대해 알아봅니다. .더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!