• 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 ?>
  • 相关阅读:
    2016-02-24 工作日记
    金字塔培训
    你找到自己的路了么?
    你是个成熟的职场人么?
    码农十年总结
    码农十年连载六
    码农十年连载五
    码农十年连载四
    码农十年连载三
    码农十年连载二
  • 原文地址:https://www.cnblogs.com/yexiang520/p/5656754.html
Copyright © 2020-2023  润新知