class BenHang extends Card{
/*构造函数与及构造的继承*/
function __construct($cardno,$pwd, $name,$money){
parent::__construct($cardno,$pwd, $name,$money);
} function take($money){
echo "本行取款{$money}没有手续费·····<br>";
}
function zhuan($money){
echo "本行转账{$money}·····<br>";
} }
$benhang=new BenHang(123,344,444,444);
$benhang->check();
$benhang->take(234);
$benhang->zhuan(4555); /*其他银行卡的类*/
class Qita extends Card{
function __construct($cardno,$pwd, $name,$money){
parent::__construct($cardno,$pwd, $name,$money);
} function take($money){
echo "非本行取款{$money}有手续费2元·····<br>";
}
}
$qita=new Qita(123,344,444,444);
$qita->check();
$qita->take(99);

 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 Person{
protected $name;
public $sex;
function __construct($name,$sex){ //声明构造函数
$this->name = $name;
$this->sex = $sex;
}
function say(){
echo "我叫{$this->name},我是{$this->sex}生!<br>";
}
} 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>=&&$age<=){
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("张三",,"男","总监");
$zhangsan->setSex("女");
$zhangsan->setAge();
// $zhangsan->setPosition("董事长");
$zhangsan->position="董事长";
$zhangsan->name="lisi";
$zhangsan->say();
三.多态
  3.1、什么是多态?
     多态实现多态的前提是实现继承。
      1.一个类被多个子类继承,如果这个类的某个方法在多个子类中表现出不同的功能,我们称这种行为为多态。在PHP中的方法重写,
     2.实现多态的必要途径:
      ⑴子类继承父类;
      ⑵重写父类方法;
      ⑶父类引用指向子类对象;

/*墨盒接口
* 纸张接口*/
interface InkBox{
function color();
}
interface Paper{
function sizes();
}
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面向对象的三大特征的更多相关文章

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

    PHP面向对象的三大特征: 继承,封装,多态 一.继承 1.如何实现继承? 给子类使用extends关键字,让子类继承父类: class Student extends Person{} 2.实现继承 ...

  2. Java面向对象的三大特征

    Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...

  3. C#学习笔记7:多态是面向对象的三大特征(封装、继承、多态)之一

    多态: 多态是面向对象的三大特征(封装.继承.多态)之一. 什么是多态? 一个对象表现出多种状态. 多态的实现方法: 1.虚方法: 2.抽象方法: 3.接口. PS:New 关键词可以隐藏父类的方法. ...

  4. OC面向对象的三大特征

    OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...

  5. Java面向对象的三大特征和五大原则

    Java面向对象的三大特征 封装 封装(Encapsulation)是指属性私有化,根据需要提供setter和getter方法来访问属性.即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问 ...

  6. Java学习:面向对象的三大特征:封装性、继承性、多态性之继承性

    面向对象的三大特征:封装性.继承性.多态性. 继承 继承是多态的前提 ,如果没有继承,就没有多态. 继承主要解决的问题就是:共性抽取. 继承关系当中的特点: 子类可以拥有父类的“内容” 子类还可以拥有 ...

  7. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  8. C#学习基础,面向对象的三大特征

    学习C#编程,相信大家除了经常接触的是hello world之外,更多的是进一步的去熟悉这门语言的基本特征,以及有哪些概念是我们必要掌握了解的,相信大家都是会知道面向对象的三大特性分别是:封装,继承, ...

  9. JavaSE| 面向对象的三大特征

    1.面向对象的基本特征之一:封装Encapsulation 目的:隐藏实现细节,让使用者方便,让代码更安全 将对象的属性和行为封装起来,其载体就是类.类通常对客户隐藏其实现细节,这就是封装的思想. 封 ...

随机推荐

  1. lua 运算符

    lua 运算符 算术运算符 操作符 描述 + 加 - 减 * 乘 / 除 % 求模 ^ 求幂 示例程序 local a, b = 1, 2 print(a + b) print(a - b) prin ...

  2. XtraBackup 原理与安装

    简介 XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Percona Server ...

  3. 《JavaScript面向对象编程指南(第2版)》读书笔记(一)

    目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...

  4. 玩转SSH端口转发

    SSH有三种端口转发模式,本地端口转发(Local Port Forwarding),**远程端口转发(Local Port Forwarding)**以及**动态端口转发(Dynamic Port ...

  5. Windows 和 Mac 系统下安装git 并上传,修改项目

    首先在MAC上怎么操作. 在gitHub创立一个账户,在创立一个项目,这就不用我说了对吧. 创建完之后是这样的: 接下来,我们打开https://brew.sh 这是下载homebrew的网站,hom ...

  6. 完美实现在同一个页面中使用不同样式的artDialog样式

    偶然发现artDialog.js这个插件,就被其优雅的设计及漂亮的效果深深吸引,在做例子时碰到了一些想当然它应该提供但却没有提供的功能,不过这都不影响我对它的喜爱,下面说一下遇到的问题吧! artDi ...

  7. 开始更新webpack踩坑笔记

    今天开始学习webpack,记录下踩过的坑-zxf

  8. [Splay模版1]

    输入 第1行:1个正整数n,表示操作数量,100≤n≤200,000 第2..n+1行:可能包含下面3种规则: 1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000, ...

  9. 蓝桥杯-分小组-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  10. 蓝桥杯- 奇妙的数字-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...