>헤드라인 >PHP 객체지향 캡슐화, 상속, 다형성의 세 가지 기본 기능을 이해하고 학습할 수 있도록 포괄적으로 안내합니다.

PHP 객체지향 캡슐화, 상속, 다형성의 세 가지 기본 기능을 이해하고 학습할 수 있도록 포괄적으로 안내합니다.

伊谢尔伦
伊谢尔伦원래의
2017-07-05 09:26:422643검색

객체 지향 프로그래밍(OOP)은 우리 프로그래밍의 기본 기술이며 PHP5는 OOP를 훌륭하게 지원합니다. OOP 아이디어를 사용하여 PHP의 고급 프로그래밍을 수행하는 방법은 PHP 프로그래밍 기능을 향상하고 좋은 웹 개발 아키텍처를 계획하는 데 매우 의미가 있습니다.

보통 데이터베이스 백엔드로 웹사이트를 구축할 때, 우리는 프로그램이 다양한 애플리케이션 환경에 적합해야 한다는 점을 고려할 것입니다. 다른 프로그래밍 언어와 다른 점은 PHP에서는 일련의 특정 기능(ODBC 인터페이스를 사용하지 않는 경우)에 의해 데이터베이스가 작동된다는 점입니다. 이는 매우 효율적이지만 캡슐화로는 충분하지 않습니다. 통합된 데이터베이스 인터페이스가 있다면 프로그램을 수정하지 않고도 이를 다양한 데이터베이스에 적용할 수 있어 프로그램의 이식성과 크로스 플랫폼 기능이 크게 향상됩니다.

이제 우리 PHP 중국어 웹사이트에서는 php 객체 지향의 세 가지 기본 기능인 캡슐화, 상속 및 다형성에 대한 포괄적인 이해를 제공합니다.

저희 PHP 중국어 웹사이트에서 관련 동영상 강좌를 보실 수 있습니다: 10장 PHP의 클래스와 객체집중강의: 이번에는 꼭 이해하셔야 합니다

PHP 중국어도 자주 시청하실 수 있습니다 매뉴얼: 클래스와 객체에 대한 튜토리얼

PHP 객체지향의 세 가지 주요 기능: 상속, 캡슐화, 다형성

소위 캡슐화는 객관적인 것을 추상 클래스로 캡슐화하는 것입니다. 그리고 클래스는 신뢰할 수 있는 클래스나 개체만 해당 데이터와 메서드를 작동하도록 허용하고 신뢰할 수 없는 클래스나 개체에게는 정보를 숨길 수 있습니다.

캡슐화는 객체지향의 특징 중 하나이며 객체와 클래스 개념의 주요 특징입니다. 간단히 말해서, 클래스는 데이터와 이러한 데이터에서 작동하는 코드를 캡슐화하는 논리적 엔터티입니다. 객체 내에서 일부 코드나 데이터는 비공개일 수 있으며 외부 세계에서 액세스할 수 없습니다. 이러한 방식으로 개체는 프로그램의 관련되지 않은 부분이 실수로 변경되거나 개체의 개인 부분을 잘못 사용하는 것을 방지하기 위해 내부 데이터에 대해 다양한 수준의 보호를 제공합니다.

소위 상속이란 특정 유형의 객체가 다른 유형의 객체 속성을 얻을 수 있도록 하는 방법을 말하며 계층적 분류 개념을 지원합니다.

상속이란 기존 클래스의 모든 기능을 사용하고 원래 클래스를 다시 작성하지 않고도 이러한 기능을 확장하는 기능을 의미합니다. 상속을 통해 생성된 새로운 클래스를 "서브클래스" 또는 "파생 클래스"라고 하며, 상속받은 클래스를 "기본 클래스", "부모 클래스" 또는 "슈퍼 클래스"라고 합니다. 상속과정은 일반에서 특수로 넘어가는 과정이다. 상속을 이루기 위해서는 '상속'과 '구성'을 통해 달성할 수 있습니다. 상속 개념을 구현하는 방법에는 구현 상속과 인터페이스 상속이라는 두 가지 유형이 있습니다. 구현 상속은 추가 코딩 없이 기본 클래스의 속성 및 메서드를 직접 사용하는 기능을 의미하며, 인터페이스 상속은 속성 및 메서드의 이름만 사용하는 기능을 의미하지만 하위 클래스는 구현을 제공해야 합니다. 다형성이라 불리는 클래스 인스턴스의 동일한 메소드는 상황에 따라 다르게 나타납니다.

다형성을 통해 내부 구조가 서로 다른 개체가 동일한 외부 인터페이스를 공유할 수 있습니다. 즉, 서로 다른 개체에 대한 특정 작업은 다르지만 해당 작업(해당 작업)은 공통 클래스를 통해 동일한 방식으로 호출될 수 있습니다.

1. 상속

1. 상속은 어떻게 구현하나요? 하위 클래스가 상위 클래스를 상속받도록 하려면 하위 클래스에 확장 키워드를 사용하세요.

class Student는 Person을 확장합니다.{}

2. ① 하위 클래스는 상위 클래스의 비공개 속성만 상속할 수 있습니다.

②하위 클래스가 상위 클래스를 상속받은 후에는 상위 클래스의

속성 및 메서드

를 하위 클래스에 복사하는 것과 동일하며 $this를 사용하여 직접 호출할 수 있습니다. 3 PHP는 단일 상속만 지원할 수 있으며 여러 클래스를 상속하는 하나의 클래스를 지원하지 않습니다. 하지만 클래스는 다단계 상속을 수행합니다.

class Person{}

class Chengnian extends Person{}

class Student extends Chengnian{}

//Student类就同时具有了Chengnian类和Person类的属性和方法

3. 메소드 재정의(메소드 재작성)조건 ① 하위 클래스가 상위 클래스를 상속합니다.

조건 ② 하위 클래스는 상위 클래스의 기존 메서드를 재정의합니다.

위의 두 가지 조건을 충족하는 것을 메소드 커버리지라고 합니다. 재정의 후 하위 클래스가 메서드를 호출하면 하위 클래스의 자체 메서드가 호출됩니다.

마찬가지로 메서드 재정의 외에도 하위 클래스는 속성 재정의를 위해 상위 클래스와 동일한 이름의 속성을 가질 수도 있습니다.

4、如果,子类重写了父类方法,如何在子类中调用父类同名方法?

partent::方法名();

所以,当子类继承父类时,需在子类的构造中的第一步,首先调用父类构造进行复制。

function construct($name,$sex,$school){

  parent::construct($name,$sex);

  $this->school = $school;

}

实例一枚:

class Student extends Person{      //子类继承父类
  public $school;           function construct($name,$sex,$school){   //子类的构造函数
   parent::construct($name,$sex);  //调用父类构造进行复制
   $this->school = $school;
  }
  
  function program(){
   echo "PHP真好玩!我爱PHP!PHP是世界上最好用的编程语言!<br>";
  }
  
  function say(){
   parent::say();      //重写父类的同名方法
   echo "我是{$this->school}的";
  }
 }
 
 $zhangsan = new Student("张三","男","起航");
 $zhangsan->say();
 $zhangsan->program();

二、封装

1、什么是封装?

通过访问修饰符,将类中不需要外部访问的属性和方法进行私有化处理,以实现访问控制

【注意】:是实现访问控制,而不是拒绝访问。 也就是说,我们私有化属性之后,需要提供对应的方法,让用户通过我们提供的方法处理属性。

2、封装的作用?

①使用者只关心类能够提供的功能,而不必关心功能实现的细节!(封装方法)

②对用户的数据进行控制,防止设置不合法数据,控制返回给用户的数据(属性封装+set/get方法)

3、实现封装操作?

① 方法的封装

对于一些只在类内部使用的方法,而不像对外部提供使用。那么,这样的方法我们可以使用private进行私有化处理。
private function formatName(){} //这个方法仅仅能在类内部使用$this调用
function showName(){
$this -> formatName();
}

②属性的封装+set/get方法

为了控制属性的设置以及读取,可以将属性进行私有化处理,并要求用户通过我们提供的set/get方法进行设置
private $age;
function setAge($age){
$this->age = $age;
}
function getAge(){
return $this->age;
}
$对象 -> getAge();
$对象 -> setAge(12);

③ 属性的封装+魔术方法

private $age;
function get($key){
return $this->$key;
}
function set($key,$value){
$this->$key=$value;
}
$对象->age; // 访问对象私有属性时,自动调用get()魔术方法,并且将访问的属性名传给get()方法;
$对象->age=12; // 设置对象私有属性时,自动调用set()魔术方法,并且将设置的属性名以及属性值传给set()方法;

【 注意】:在魔术方法中,可以使用分支结构,判断$key的不同,进行不同操作。

4、关于封装的魔术方法:

① set($key,$value):给类私有属性赋值时自动调用,调用时给方法传递两个参数:需要设置的属性名、属性值;

② get($key):读取类私有属性时自动调用,调用时给方法传递一个参数:需要读取的属性名;

③ isset($key):外部使用isset()函数检测私有属性时,自动调用。

>>> 类外部使用isset();检测私有属性,默认是检测不到的。false

>>> 所以,我们可以使用isset();函数,在自动调用时,返回内部检测结果。

function isset($key){
  return isset($this->$key);
}

当外部使用isset($对象名->私有属性);检测时,将自动调用上述isset()返回的结果!

④ unset($key):外部使用unset()函数删除私有属性时,自动调用;

function unset($key){
  unset($this->$key);
}

当外部使用unset($对象名->私有属性);删除属性时,自动将属性名传给unset(),并交由这个魔术方法处理。

实例一枚

class Person{
  public $name;
  public $age;
  public $sex;
  function construct($name, $age,$sex){
   $this->name=$name;
   $this->setAge($age);
   $this->setSex($sex);
  }
  function setAge($age){
   if($age>=0&&$age<=120){
   return $this->age=$age;
   }else{
    die("年龄输入有误!!!");
   }
  }
  function setSex($sex){
   if($sex=="女"||$sex=="男"){
   return $this->sex=$sex;
   }else{
    die("性别输入有误!!!");
   }
  }
  function say(){
   echo "我的名字叫{$this->name},我的年龄{$this->age},我的性别是{$this->sex}<br>";
  }
 }
class Work extends Person{private $position;
  function construct($name, $age,$sex,$position){
   parent::construct($name, $age,$sex);
   $this->job=$job;
   $this->setPosition($position);
  }
  function setPosition($position){
   $arr=[&#39;总监&#39;,&#39;董事长&#39;,&#39;程序员&#39;,&#39;清洁工&#39;];
   if(in_array($position, $arr)){
    return $this->position=$position;
   }else{
    die("不存在该职位");
   }
  }  
  function set($key,$value){
   if($key=="age"){
    return parent::setAge($value);
   }
   elseif($key=="sex"){
    return parent::setSex($value);
   }
   elseif($key=="position"){
    return $this->setPosition($value);
   }
   return $this->$key=$value;
  }
  
  function say(){
   parent::say();
   echo "我的职位是{$this->position}";
  }
  }
  
 $zhangsan=new Work("张三",22,"男","总监");
 $zhangsan->setSex("女");
 $zhangsan->setAge(30);
// $zhangsan->setPosition("董事长");
 $zhangsan->position="董事长";
 $zhangsan->name="lisi";
 $zhangsan->say();

三.多态

3.1、什么是多态?

多态实现多态的前提是实现继承。

1.一个类被多个子类继承,如果这个类的某个方法在多个子类中表现出不同的功能,我们称这种行为为多态。在PHP中的方法重写,

2.实现多态的必要途径:

⑴子类继承父类;

⑵重写父类方法;

⑶父类引用指向子类对象;

class Computer{
 function fangfa(InkBox $a,Paper $b){  //父类引用
 echo "即将开始打印····<br>"; 
 $a->color();
 $b->sizes();
 echo "打印结束···<br>"; 
 
 }
}

class Color implements InkBox{
 function color(){
 echo "正在装载彩色墨盒<br>";
 echo "实现彩色墨盒<br>";
 }
}
class White implements InkBox{
 function color(){
 echo "正在装载黑白墨盒<br>"; 
 echo "实现黑白墨盒<br>";
 }
}
class A4 implements Paper{
 function sizes(){
 echo "正在加载A4纸张<br>";
 echo "实现A4纸张<br>";
 }
}
class A5 implements Paper{
 function sizes(){
 echo "实现A5纸张<br>";
 }
}

$com=new Computer();//创建对象
$com->fangfa(new Color(),new A4());//子类对象

相关课程推荐:

视频教程: 韩顺平 2016年 最新PHP面向对象编程视频教程

视频教程: PHP面向对象编程视频教程

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