全面解析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第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
php微信支付之APP支付方法
Mar 04 PHP
PHP SplObjectStorage使用实例
May 12 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
PHP使用pdo实现事务处理操作示例
Sep 05 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
JS实现横向轮播图(中级版)
2020/01/18 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
django中send_mail功能实现详解
2018/02/06 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
职业技术学校毕业生推荐信
2013/12/03 职场文书
经典大学生求职信范文
2014/01/06 职场文书
农村葬礼主持词
2014/03/31 职场文书
建议书的格式
2014/05/12 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL