zoukankan      html  css  js  c++  java
  • 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 ?>
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/yexiang520/p/5656754.html
Copyright © 2011-2022 走看看