PHP面向对象(三)
一、继承概念
继承性也是面向对象程序设计中的重要特性之一。它是指建立一个新的派生类,从一个先前定义的类中继承数据和函数,而且可以重新定义新的数据类型和函数,从而建立累的层次或等级关系。
格式:
[修饰符] class 子类名 extends 父类名
{
...
}
假如B类继承A类,那么
从内存上来讲:B继承了A中所有的属性和方法;但是父类中的private部分不能直接访问
从使用上来讲:B继承了A中所有非私有的属性和方法
其中A叫父类(基类)。 B叫子类(派生类)
PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,不允许一个类直接继承多个类,但一个类可以被多个类继承。可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又继承了类B,那么类C也间接继承了类A。
1 class A 2 { 3 } 4 class B extends A 5 { 6 } 7 class C extends B 8 { 9 }
注意:
子类继承父类的所有内容,但父类中的private部分不能直接访问
子类中新增加的属性和方法是对父类的扩展
子类中定义的与父类同名的属性是对父类属性的覆盖,同名的方法也是对父类方法的覆盖
public(公有) protected(受保护) private(私有)
===========================================================
在本类中 Y Y Y
在子类中 Y Y N
在类外边 Y N N
1 <?php 2 3 class A 4 { 5 public $x=10; 6 protected $y=200; 7 private $z=3000; 8 9 public function fun1() 10 { 11 echo "class A fun1....<br>"; 12 } 13 14 protected function fun2() 15 { 16 echo "class A fun2....<br>"; 17 } 18 19 private function fun3() 20 { 21 echo "class A fun3....<br>"; 22 } 23 24 } 25 //类B继承类A 26 class B extends A 27 { 28 29 } 30 $b=new B(); 31 var_dump($b); 32 /* 33 object(B)[1] //B继承了A的所有属性 34 public 'x' => int 10 //公有的还是共有的 35 protected 'y' => int 200 //受保护的还是受保护的 36 private 'z' (A) => int 3000 //私有的可以看到任然属于类A 37 */ 38 echo $b->x; //输出公有属性 10 39 //echo $b->y; //尝试输出受保护的失败 Fatal error: Cannot access protected property B::$y 40 //echo $b->z; //尝试输出私有属性失败 Notice: Undefined property: B::$z 41 ?>
二、继承中的使用(易维护,易扩展)
在子类里面允许重写(覆盖)父类的方法 在子类中,使用parent访问父类中的被覆盖的属性和方法 parent::__construce(); parent::fun();
1 <?php 2 //类的继承使用(parent的使用) 3 4 class Person 5 { 6 private $name; 7 private $age; 8 9 public function __construct($name,$age) 10 { 11 $this->name = $name; 12 $this->age = $age; 13 } 14 15 public function getInfo() 16 { 17 return " 姓名:".$this->name." 年龄:".$this->age; 18 } 19 } 20 21 class Stu extends Person 22 { 23 private $classid; 24 25 public function __construct($name,$age,$classid) 26 { 27 parent::__construct($name,$age); 28 $this->classid = $classid; 29 } 30 31 public function getInfo() //重写(覆盖)父类方法,达到不修改只添加,易维护 32 { 33 return parent::getInfo()." 班级:".$this->classid; 34 } 35 public function say() //添加父类没有的方法,达到扩展功能,易扩展 36 { 37 echo "hello world!<br>"; 38 } 39 } 40 41 42 $s = new Stu("wangwu",26,"lamp149"); 43 echo $s->getInfo()."<br>"; 44 $s->say(); 45 46 $p = new Person("zhangsan",22); 47 echo $p->getInfo()."<br/>"; 48 ?>
三、final关键字
在PHP5中新增加了final关键字,它只能用来修饰类和方法,不能使用final这个关键字来修饰成员属性,因为final是常量的意思,我们在PHP里定义常量使用的是define()函数和const关键字,所以不能使用final来定义成员属性。
final的特性:
使用final关键字标识的类不能被继承;
使用final关键字标识的方法不能被子类覆盖(重写),是最终版本;
目的:一是为了安全,二是没有必要
1 <?php 2 //类中final关键字的使用: 3 //final关键字可修饰类和方法,被修饰的类不可有子类,修饰的方法不可被子类覆盖。 4 5 //final修饰的类不可有子类。 6 final class A 7 { 8 //使用final关键字修饰的方法不可以被子类覆盖 9 public final function fun1() 10 { 11 echo "aaaaaaaaaaaaa<br/>"; 12 } 13 14 public final function max($a,$b) //这种方法是没有必要重写的 15 { 16 return $a>$b?$a:$b; 17 } 18 } 19 20 /* 21 class B extends A //类A带有final修饰,不能被继承 22 { 23 24 public function fun1() //如果类A没有被final修饰但是由于fun1有关键字final修饰不能被重写(覆盖) 25 { 26 echo "bbbbbbbbbbbb<br/>"; 27 } 28 } 29 */ 30 ?>
四、static关键字
表示静态的意思: 用于修饰类的属性和方法
static关键字修饰方法称为静态方法,可以不用new(实例化)就可以直接使用方法:如 类名::方法名
注意:静态方法在实例化后的对象也可以访问 //$对象名->静态方法名
static关键字修饰属性称为静态属性,可以不用new(实例化)就可以直接访问属性:如 类名::属性名
注意:静态属性在实例化后的对象不可以访问; //$对象名->静态属性名
注意: 静态属性是共享的。也就是new很多对象也是共用一个属性
在静态方法中不可以使用非静态的内容。就是不让使用$this
在类的方法中可以使用其他静态属性和静态方法,不过要使用self关键字:
如 【self::静态属性名】或【self::静态方法名】
(>PHP5.3)在一个类的方法中若没有出现$this的调用,默认此方法为静态方法。
类中的静态属性和静态方法不用实例化(new)就可以直接使用类名访问。
格式: 类::$静态属性 类::静态方法
在类的方法中,不能用this来引用静态变量或静态方法,而需要用self来引用。
格式: self::$静态属性 self::静态方法
1 <?php 2 //static静态关键字使用 3 4 class A 5 { 6 //使用static关键字修饰的属性称静态属性,特点是不用实例化就可直接通过类名::调用 7 public static $name="lisi"; 8 9 //使用static关键字修饰的方法称静态方法,特点是不用实例化就可直接通过类名::调用 10 public static function max($a,$b) 11 { 12 13 return $a>$b?$a:$b; 14 } 15 16 public static function add($x,$y) 17 { 18 return $x+$y; 19 } 20 21 public function demo() 22 { 23 //在类中调用其他静态属性和方法使用关键字self 24 echo self::$name; 25 echo self::add(30,40); 26 27 } 28 29 } 30 31 echo A::max(10,20); //20 32 echo A::add(10,20); //30 33 echo A::$name; //获取静态属性 34 35 A::$name = "wangwu"; 36 37 echo "<hr/>"; 38 $a = new A(); 39 $a->demo(); 40 ?>
单例(单态)模式
单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
要点:1.构造方法私有化
2.定义私有静态的对象属性
3.提供公有静态的实例化当前类对象的方法,内部判断
1 <?php 2 //PHP手册单例模式例子 3 class Example 4 { 5 // 2.保存类实例在此属性中 6 private static $instance; 7 8 // 1.构造方法声明为private,防止直接创建对象 9 private function __construct() 10 { 11 echo 'I am constructed'; 12 } 13 14 // 3.singleton 方法 15 public static function singleton() 16 { 17 if (!isset(self::$instance)) { 18 $c = __CLASS__; 19 self::$instance = new $c; 20 } 21 22 return self::$instance; 23 } 24 25 // Example类中的普通方法 26 public function bark() 27 { 28 echo 'Woof!'; 29 } 30 31 //4.阻止用户复制对象实例 32 public function __clone() 33 { 34 trigger_error('Clone is not allowed.', E_USER_ERROR); 35 } 36 37 } 38 39 ?>
五、const关键字
在类中修饰成员属性,将其定义成常量(不可修改的),一般要求常量名都是大写的,没有“$”符 没有其他修饰符(public)
定义格式: const 成员常量名="值";
使用:
在类的方法中: echo self::成员常量名;
在类的外部: echo 类名::成员常量名;
1 <?php 2 //类中常量定义 3 define("PI",3.14); 4 const WTO = "世贸组织"; 5 6 7 class Game 8 { 9 const UP=37; 10 const RIGHT=38; 11 const DOWN=39; 12 const LEFT=40; 13 14 public function move($m) 15 { 16 switch($m){ 17 case 37: echo "向上移动...<br/>"; break; 18 case 38: echo "向右移动...<br/>"; break; 19 case 39: echo "向下移动...<br/>"; break; 20 case 40: echo "向左移动...<br/>"; break; 21 } 22 23 } 24 } 25 26 $g = new Game(); 27 $g->move(38); 28 $g->move(37); 29 $g->move(Game::LEFT); //使用类中常量提高代码的可读性。 30 $g->move(Game::DOWN); 31 ?>
六、instanceof
用于确定一个 PHP 变量是否属于某一类 class 的实例(亲自鉴定)
1 <?php 2 //instanceof类型运算符 3 4 class A{} 5 6 class B extends A{} 7 8 class C{} 9 10 $a = new A(); 11 $b = new B(); 12 $c = new C(); 13 14 var_dump($a instanceof A); //bool(true) 15 var_dump($b instanceof A); //bool(true) 16 var_dump($b instanceof B); //bool(true) 17 var_dump($c instanceof C); //bool(true) 18 echo "<hr/>"; 19 var_dump($c instanceof A); //bool(false) 20 var_dump($c instanceof B); //bool(false) 21 ?>
转载于:https://www.cnblogs.com/yexiang520/p/5656754.html
PHP面向对象(三)相关推荐
- python面向对象思路_Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- python面向对象之面向对象三要素
面向对象三要素 封装: 通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口. 继承: 继承是从已有类得到继承信息创建新类的过程.提供继承信息的类被称为父类(超类.基类);得 ...
- Python基础学习——面向对象编程(第一讲:面向对象概述、面向对象三个基本特征(封装性、继承性、多态性)、类和对象(定义类、创建和使用对象、实例变量、类变量、构造方法、实例方法、类方法、静态方法))
面向对象是Python最重要的特性,在Python中一切数据类型都是面向对象的. 1.面向对象概述 面向对象的编程思想是,按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建软件系 ...
- JavaSE入门:面向对象(三)
目录 5.抽象类和接口 1.抽象类 2.接口 3.抽象类和接口的区别 4.例题 1.模拟笔记本电脑接口案例 2.会员卡打折案例 3.不同几何体面积案例 4.写作文案例 6.内部类及OOP实战 1.成员 ...
- python第十四课 面向对象(三)
文章目录 一.继承的简介 二.方法的重写 三.super() 四.多重继承 五.多态 六 类中的属性和方法 类属性 实例属性 实例方法 类方法 静态方法 一.继承的简介 1.提高了代码的复用性 2.让 ...
- 黑马程序员-----JAVA面向对象(三)
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 模板方法设计模式: 解决的问题:当功能内部一部 ...
- (兔C残篇)Java面向对象三个基本特征:封装
今天聊天的主题是面向对象的三个基本特性之一的封装. 文章目录 1. 封装 1.1 高内聚 1.2 低耦合 1.3 封装 1. 封装 对于java封装的这个特性我们可以简易的理解成该露的露,该藏的藏. ...
- Python——面向对象三特征
1.初识继承 什么是继承? --继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 子类会"遗传"父类的 ...
- JAVA初等基础__(面向对象三个特征, 封装,继承,多态)
练习:设计一个CBox类,具有length.width和height三个属性,对每个属性都提供相应的get和set方法,提供构造函数,完成CBox信息的初始化,增加volume()方法,用来计算CBo ...
最新文章
- STM32 定时器 定时时间的计算
- python教育学_使用Python处理教育学领域的数据——以某篇期刊论文为例
- RabbitMq--4--集群(转载)
- MySQL分库分页_MySQL分库分表的分页查询解决方案
- 一分钟带你了解Huawei LiteOS组件开发指南
- 关于C++ 中大小端和位域
- Java 蹒跚自学之 第八日 数组 二分查找法
- 写篇技术博客被简书锁定是一种什么样的体验
- HTML5期末大作业:我的家乡网站设计——我的家乡-杭州(7页) HTML+CSS+JavaScript 大学生家乡网页作品 老家网页设计作业模板 学生网页制作源代码下载
- 变速齿轮Delphi实现
- 关于bootbox.js自定义弹出框样式,如修改宽度等
- 《西点军校的经典法则》序 -- 責任(せきにん)、栄誉(えいよ)、国家(こっか)...
- “衣带渐宽终不悔,为伊消得人憔悴” 读《唐宋词十七讲》有感二 —— 2021.12.23 晚八时
- 力扣多线程练习----交替打印FooBar---打印零与奇偶数
- Ecshop系统二次开发教程及流程演示
- SQLyog 报错2058 :连接 mysql 8.0.11 解决方法
- 计算机考试的话语,为考试加油的暖心句子 期末考试加油鼓励的话
- 纪中DAY15做题小结
- Vue SPA应用微信开发踩坑记录
- D. Tournament Countdown
热门文章
- 查看PLC IP 端口_西门子828D数控系统X130接口通讯怪异现象(X130手动设置的 IP)...
- python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片
- protected访问权限_权限修饰符 /重写
- Redis对象的refcount与lru属性(内存回收、对象共享、空转时长)
- linux下怎么查kill某个进程,Linux下查询进程PS或者杀死进程kill的小技巧
- python随机生成字符串_python 随机生成字符串数据
- win下python2,3和pip2,3双版本共存
- uva 10883——Supermean
- 【操作系统】哲学家就餐问题
- redis源码剖析(七)—— Redis 数据结构dict.c