PHP의 객체지향 학습의 세 가지 주요 특징 학습 목표: 추상화, 캡슐화, 상속 및 다형성을 완전히 이해합니다.
객체 지향의 세 가지 주요 특징: 캡슐화, 상속, 다형성 먼저 추상화를 간략하게 이해합니다.
우리가 하는 일 앞서 클래스를 정의할 때 실제로는 사물의 클래스의 공통 속성과 동작을 추출하여 물리적 모델(템플릿)을 형성합니다. 이러한 문제 연구 방법을 추상화라고 합니다.
1. 캡슐화
캡슐화 추출된 데이터와 데이터에 대한 작업은 함께 캡슐화됩니다. 데이터는 내부적으로 보호되며 프로그램의 다른 부분에서 승인된 작업(메서드)만 데이터에 대해 작업할 수 있습니다.
php는 세 가지 액세스 제어 수정자를 제공합니다.
public은 전역을 의미하며 이 클래스 내부, 클래스 외부 및 하위 클래스에 액세스할 수 있습니다.
protected는 보호됨을 의미하며 이 클래스 또는 하위 클래스만 액세스할 수 있습니다.
private은 비공개를 의미하며 이 클래스만 액세스할 수 있습니다. 내부에서 액세스할 수 있습니다. the class
위 세 가지 수정자는 메소드와 속성(변수)을 모두 수정할 수 있습니다. 메소드에 액세스 수정자가 없으면 기본값은 public입니다. 멤버 속성은 액세스 수정자를 지정해야 합니다. 이는 PHP4 var $ 이름으로도 작성됩니다. public 속성이므로 이런 방식은 권장되지 않습니다
예:
코드 복사 코드는 다음과 같습니다.
<?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); )는 protected 또는 private
__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
해결 방법: Inherit
코드 복사 코드는 다음과 같습니다.
<?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(); ?>
class 상위 클래스 이름 {}
class 하위 클래스. name 확장 상위 클래스 이름 {}
세부 사항:
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 ?>
public 함수 __construct (){ 复制代码 代码如下: 相关推荐: PHP面向对象五大原则之依赖倒置原则(DIP)详解_php技巧 위 내용은 PHP 객체지향의 세 가지 주요 특징을 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
echo 'A'
}
}
클래스 B 확장 A{
public function __construct(){
echo 'B'
}
}
$b=new B();/ /여기서 B의 생성자가 먼저 출력됩니다. B에 생성자가 없으면 A의 생성자가 출력됩니다. 3. 하위 클래스에서 상위 클래스의 메서드에 액세스해야 하는 경우(생성자 및 멤버 메서드의 수정자는 다음과 같습니다. protected 또는 private), parent class::method name 또는 parent::method name을 사용하여 완료할 수 있습니다. [여기서 parent와 이전에 언급한 self는 모두 소문자이며 오류는 대문자로 보고됩니다.]
class A{
public function test(){
echo 'a_test';
}
}
class B는 A를 확장합니다.
}
}
$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、如果子类要去调用父类的某个方法(protected/public),可以使用 父类名::方法名 或者 parent::方法名
3、在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限(即不能缩小父类方法的访问权限)
如 父类public function cry(){} 子类 protected function cry(){} 则会报错
但是子类的访问权限可以放大,如:
父类private function cry(){} 子类 protected function cry(){} 可以正确执行
扩展:
方法重载(overload)
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载,
这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call
【官方不推荐使用】
PHP中有以下几个魔术常量:__LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ 等
例: <?php
class A{
function test1($p){
echo 'test1<br/>';
}
function test2($p){
echo 'test2<br/>';
}
function __call($method,$p){
//这里$p为数组,上面两个变量名可自定义
if($method == 'test'){
if(count($p)==1){
$this->test1($p);
} else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(5);
$a->test(3,5);
?>