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.pswp.cn/news/395600.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395600.shtml
英文地址,請注明出處:http://en.pswp.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;百度…