全面解析PHP面向对象的三大特征


Posted in PHP onJune 10, 2017

PHP面向对象的三大特征: 继承,封装,多态

一.继承

1、如何实现继承?

给子类使用extends关键字,让子类继承父类;

class Student extends Person{}

2、实现继承的注意事项?

① 子类只能继承父类的非私有属性。

②子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用。

③ 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=['总监','董事长','程序员','清洁工'];
   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());//子类对象

以上这篇全面解析PHP面向对象的三大特征就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 如何向 MySQL 发送数据
Oct 09 PHP
PHP的基本常识小结
Jul 05 PHP
php中explode函数用法分析
Nov 15 PHP
PHP检测用户语言的方法
Jun 15 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 PHP
深入理解PHP中的count函数
May 31 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
phpfpm的作用和用法
Oct 10 PHP
PHP查询分页的实现代码
Jun 09 #PHP
PHP简单留言本功能实现代码
Jun 09 #PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 #PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 #PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 #PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 #PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 #PHP
You might like
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python3去掉string中的标点符号方法
2019/01/22 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
Python对列表的操作知识点详解
2019/08/20 Python
python多线程实现TCP服务端
2019/09/03 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python内置模块collections知识点总结
2019/12/19 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
大学生的四年学习自我评价
2013/12/13 职场文书
小学生自我评价范文
2014/01/25 职场文书
西式婚礼主持词
2014/03/13 职场文书
道路建设实施方案
2014/03/18 职场文书
二手车转让协议书
2015/01/29 职场文书
教师学期个人总结
2015/02/11 职场文书
金榜题名主持词
2015/07/02 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android