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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据结构的应用场景不包括,Python 数据结构学习

Python 数据结构学习列表list.append(x)在列表的末尾添加一个元素。相当于 a[len(a):] [x] 。list.extend(iterable)使用可迭代对象中的所有元素来扩展列表。相当于 a[len(a):] iterable 。list.insert(i, x)在给定的位置插入一个元素。第一个参数是要插入的元素的索引&#…

[Jinkey 原创]震惊!iOS 系统居然自带悬浮窗口调试工具

原文链接 : 震惊&#xff01;iOS 系统居然自带悬浮窗口调试工具 —— Jinkey 原创原文作者 : Jinkey1 背景 英文原文&#xff1a;http://ryanipete.com/blog/ios/swift/objective-c/uidebugginginformationoverlay/ 我写得这个并不是翻译而是用自己的理解重新表述这个功能&…

盲人编程_盲人如何编码

盲人编程About one out of every 200 software developers is blind. We know this because Stack Overflow asked 64,000 developers about this a few months ago.每200名软件开发人员中大约有1名是盲人。 我们之所以知道这一点&#xff0c;是因为几个月前 Stack Overflow 向…

hadoop环境搭建笔记

一、配置Linux &#xff08;1&#xff09;cat /etc/networks &#xff08;2&#xff09;cat /etc/sysconfig/network &#xff08;3&#xff09;vi /etc/udev/rules.d/70-persistent-net.rules eth1 改为eth0 &#xff08;4&#xff09;vi /etc/sysconfig/network-scripts/ifc…

边分治讲解

前言&#xff1a; 边分治和点分治一样属于树分治的一部分&#xff0c;相比于点分治&#xff0c;边分治对于与度数相关的问题有着很大的优势&#xff0c;同时边分治也是解决树上最优化问题的一种重要的算法。 分治过程&#xff1a; 边分治的分治过程与点分治类似&#xff0c;同样…

准确性 敏感性 特异性_如何掌握类型特异性的艺术

准确性 敏感性 特异性Do more specific definitions result in less flexibility?更具体的定义会导致灵活性降低吗&#xff1f; In this post I will try to avoid the debate about strong/static vs. weak/dynamic types (what more could possibly be said?), or even sc…

Pycharm社区版配置Django

Pycharm开发版(收费)自带Django模板&#xff0c;社区版(免费)需要通过命令行创建Django项目。 通过pip安装Django&#xff1a;pip install django2.0.2(版本号)&#xff0c;可通过以下命令检查是否安装成功 在命令行下创建Django项目(项目存放在D:\PyCharm) 1.创建项目 进入D:\…

家里也是不知不觉就电脑有不能开启了

一如既往的把电脑搬上去&#xff0c;我推测就是因为内存条金手指的接触不好了&#xff0c;然后多次的强制关机让我心疼&#xff0c;还有是花了30元装系统还是有些不服气&#xff0c;最后还是要回去弄好。 转载于:https://www.cnblogs.com/bkchengzheng/p/5662222.html

oracle model 分组,【已解决】关于Oracle分组函数高级用法(按照N条分组并生成唯一号)...

prompt PL/SQL Developer import fileprompt Created on 2018年3月30日 byset feedback offset define offprompt Creating T_TEST_GROUP...create table T_TEST_GROUP(code VARCHAR2(100),supplier VARCHAR2(100),item_id VARCHAR2(100),num NUMBER,lot VARCHA…

用Mesos分布式架构进行工作

引言&#xff1a;2010年&#xff0c;一个旨在解决扩容问题的项目诞生——Apache Mesos&#xff0c;它在某种程度上对CPU、内存、磁盘资源进行抽象&#xff0c;从而允许整个数据中心如同单台大服务器般运转。无需虚拟机和操作系统&#xff0c;Mesos创造了一个单独底层的集群为应…

angular和react_如何在Angular中验证默认和自定义React形式

angular和reactby Luuk GruijsLuuk Gruijs着 如何在Angular中验证默认和自定义React形式 (How to validate default and custom reactive forms in Angular) When presenting forms to your users, it’s considered very user-friendly to give them immediate feedback on w…

POJ 1502 MPI Maelstrom 最短路

最短路模板。 题意&#xff1a;从‘1’点发出一个信号到各个点&#xff0c;不同的点可以同时发出一个信号但到达目标的时间不同&#xff0c;问所有点接受到信号所耗费的最短时间为多少。 思路&#xff1a;迪杰斯特拉求出1点到各个点的最短路&#xff0c;遍历一遍找到其中的最大…

调试dump文件

调试dump文件 1、设置好pdb文件和源代码路径 为了能正确分析Dump文件&#xff0c;我们必须要指定和程序一起出来的PDB文件&#xff0c;如果程序重新被编译了一次&#xff0c;即使代码没有任何变化&#xff0c;之前的PDB文件我们不能再继续使用。posted on 2018-12-28 17:50 mao…

不一样的视角,程序员世界里的环保

摘要&#xff1a; 我们身边有很多可以做的技术环保工作。比如说&#xff0c;在Linux下少用root用户&#xff0c;SQL的时候&#xff0c;delete前先select&#xff0c;这样&#xff0c;你就不会做出一些让你后悔的事。不会让你重头来过&#xff0c;从而至少不会浪费电能。写代码的…

oracle查出连续5行,Oracle期末考试复习题2

复习题一、填空题&#xff1a;1. Oracle EnterpriseManager是一个基于 B/S的框架系统。2&#xff0e;Oracle数据库的存储结构分为物理结构和逻辑结构。3&#xff0e;在游标或者游标变量打开后还没有进行第一次提取时&#xff0c;&#xff05;found属性为null。4. 在oracle中已c…

selinux会阻碍挂载嘛_为什么追求完美可能会阻碍您成为新手Web开发人员

selinux会阻碍挂载嘛by Rick West由里克韦斯特(Rick West) 为什么追求完美可能会阻碍您成为新手Web开发人员 (Why striving for perfection might be holding you back as a newbie web developer) I am a perfectionist. Or, at least, I like to think I am. Either way, I’…

MySQL优化的一些基础

在Apache, PHP, mysql的体系架构中&#xff0c;MySQL对于性能的影响最大&#xff0c;也是关键的核心部分。对于Discuz!论坛程序也是如此&#xff0c;MySQL的设置是否合理优化&#xff0c;直接 影响到论坛的速度和承载量&#xff01;同时&#xff0c;MySQL也是优化难度最大的一个…

oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock

1、Oracle锁类型锁的作用latch锁&#xff1a;chain&#xff0c;链LOCK锁排他锁(X)共享锁(S)2、行级锁&#xff1a;DML语句事务锁TX锁的结构事务锁的加锁和解锁过程只有排他锁不影响读(CR块)3、表级锁&#xff1a;TM行级排他锁(Row exclusive)RX锁当我们进行DML时&#xff0c;会…

电线之间:采访Microsoft Edge性能PM Nolan Lawson

by Vivian Cromwell通过维维安克伦威尔(Vivian Cromwell) 电线之间&#xff1a;采访Microsoft Edge性能PM Nolan Lawson (Between the Wires: An interview with Microsoft Edge performance PM Nolan Lawson) I interviewed Nolan Lawson, Web Performance PM at Microsoft E…

swift菜鸟入门视频教程-09-类和结构体

本人自己录制的swift菜鸟入门&#xff0c;欢迎大家拍砖&#xff0c;有什么问题能够在这里留言。主要内容&#xff1a;类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合&#xff08;collection&#xff09;类型的赋值与复制行为视频地址&#xff1a;百度…