php物件導向中的繼承,多態,介面,抽象類別,抽象方法執行個體教程

來源:互聯網
上載者:User
這篇文章主要介紹了PHP入門教程之物件導向的特性,結合執行個體形式分析了php物件導向所涉及的繼承、多態、介面、抽象類別及抽象方法等,需要的朋友可以參考下

本文執行個體講述了PHP物件導向的特性。分享給大家供大家參考,具體如下:

Demo1.php

<?php  header('Content-Type:text/html; charset=utf-8;');  //建立一個電腦類  class Computer {    //什麼叫做類內,就是建立類的花括弧內的範圍叫做類內,其他地方則類外。    //public 是對欄位的公有化,這個欄位類外即可訪問,賦值和取值    public $_name = '聯想';  }  $computer = new Computer();  $computer -> _name = 'Dell';  echo $computer->_name;?>

Demo2.php

<?php  header('Content-Type:text/html; charset=utf-8;');  class Computer {    //private 是私人化,即對欄位進行封裝的操作,類外無法訪問,取值和賦值都不能操作    private $_name = '聯想';  }  $computer = new Computer();  echo $computer->_name;?>

Demo3.php

<?php  header('Content-Type:text/html; charset=utf-8;');  class Computer {    private $_name = '聯想';    //這個時候我採用一個公用對外的方法來訪問私人欄位    //因為私人欄位只能在類內訪問,而對外的公用方法是類內的。    //更而公用方法又是公用的,所以類外又可訪問。    public function _run(){      //欄位在類內調用的時候必須是類 -> 欄位,而$_name只是一個普通變數而已。      //欄位在類外調用的方法是對象 -> 欄位,而類內就必須使用 Computer -> _name      //但是在本類中,可以使用一個關鍵字來代替字來代替 Computer ,那就是 $this      echo $this ->_name;    }  }  $computer = new Computer();  $computer -> _run();?>

Demo4.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    private $name;    private $model;    private $cpu;    private $keyboard;    private $show;    private $zb;    //必須寫個對外的入口,才可以取到    public function getName() {      return $this->name;    }    //必須寫一個對內的入口,對私人欄位進行賦值    public function setName($name) {      //這裡的 $name 只是一個變數而已,參數而已      //$this->name 才是類的欄位      $this->name = $name;    }  }  $computer = new Computer ();  echo $computer->getName();  $computer->setName('Dell');  echo $computer->getName();?>

Demo5.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    private $_name;    private $_model;    private $_cpu;    //當類外的對象直接調用私人欄位時,會跟著去檢查是否有攔截器,    //如果直接對 $_name 進行賦值,那麼set 方法就會攔截住,就不會報錯了。    //採用攔截器進行賦值和取值    //賦值    private function set($_key,$_value){      //採用$_key = '_name',那麼 $_value = '聯想';      //$this ->_name = '聯想';      $this ->$_key = $_value;    }    //取值    private function get($_key){      return $this -> $_key;      //如果 $_key = '_name' 那麼 $this -> _name;      //如果 $_key = '_cpu' 那麼 $this -> _cpu;      //如果 $_key = '_model' 那麼 $this -> _model;    }  }  $computer = new Computer ();  $computer->_name = '聯想';  $computer->_cpu = '四核';  $computer->_model = 'i7';  echo $computer->_name;  echo $computer->_cpu;  echo $computer->_model;?>

Demo6.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    private $_name;    private $_model;    private $_cpu;    //set 和 get 方法私人了,還是可以執行,是因為    //因為目前程式的指標已經在類內了。而類內可以執行封裝的方法    //類內執行私人方法,不會出現任何錯誤。    //它只需要間接的攔截就可以了。攔截是在內類執行的。    //說白了,set() 和 get() 是 PHP 內建的方法,具有一定的特殊性    private function set($_key, $_value) {      $this->$_key = $_value;    }    private function get($_key) {      return $this->$_key;    }  }  $computer = new Computer ();  $computer->_name = '聯想';  $computer->_cpu = '四核';  $computer->_model = 'i7';  echo $computer->_name;  echo $computer->_cpu;  echo $computer->_model;?>

Demo7.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    const NAME = 'DELL';  }  //常量的輸出方法 類::常量  echo Computer::NAME;    //DELL?>

Demo8.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    public $_count = 0;    public function _add(){      $this -> _count++;  //$_count = $_count+1 $_count++    }  }  //做一個累計的效果  $computer1 = new Computer();  $computer1 ->_add();  $computer1 ->_add();  $computer1 ->_add();  echo $computer1 -> _count;  echo '<br />';  $computer2 = new Computer();  $computer2 ->_add();  $computer2 ->_add();  $computer2 ->_add();  echo $computer2 -> _count;?>

Demo9.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    public static $_count = 0;    public function _add(){      //如果是靜態成員欄位,那麼就應該用 self 來調用,而不是 $this      self::$_count++;    }  }  //做一個累計的效果  $computer1 = new Computer();  $computer1 ->_add();  echo Computer::$_count;  $computer1 ->_add();  echo Computer::$_count;  $computer1 ->_add();  echo Computer::$_count;  echo '<br />';  $computer2 = new Computer();  $computer2 ->_add();  echo Computer::$_count;  $computer2 ->_add();  echo Computer::$_count;  $computer2 ->_add();  echo Computer::$_count;?>

Demo10.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    public static $_count = 0;    public static function _add(){      self::$_count++;    }  }  Computer::_add();  Computer::_add();  Computer::_add();  echo Computer::$_count;?>

Demo11.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {  }  $computer = new Computer();  echo $computer instanceof Computer;?>

Demo12.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  //這是父類,電腦類  class Computer {    public $_name = '聯想';    public function _run(){      echo '聯想在運行!';    }  }  //子類,膝上型電腦類  class NoteComputer extends Computer {  }  $noteComputer = new NoteComputer();  echo $noteComputer -> _name;  $noteComputer -> _run();?>

Demo13.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    public $_name = '聯想';    public function _run(){      echo '聯想在運行!';    }  }  class NoteComputer extends Computer {    //我不需要父類的欄位和方法,那麼可以採用重寫的方法覆蓋掉父類的欄位和方法    public $_name = 'Dell';    public function _run(){      echo 'Dell在運行!';    }  }  $noteComputer = new NoteComputer();  echo $noteComputer -> _name;  $noteComputer -> _run();?>

Demo14.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    //私人化,但是無法被子類繼承,這個時候就應該用受保護的修飾符來封裝    protected $_name = '聯想';    protected function _run(){      return '聯想在運行!';    }  }  class NoteComputer extends Computer {    public function getTop() {      echo $this->_name;      echo $this->_run();    }  }  $noteComputer = new NoteComputer();  $noteComputer -> getTop();?>

Demo15.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  class Computer {    public $_name = '聯想';    public function _run(){      return '聯想在運行!';    }  }  class NoteComputer extends Computer {    //我子類已經覆蓋了父類的欄位和方法,    //但是我又要調用父類的欄位和方法,那怎麼辦呢?    public $_name = 'Dell';    public function _run(){      echo 'Dell在運行!';      echo parent :: _run();    }  }  $noteComputer = new NoteComputer();  echo $noteComputer -> _name;  $noteComputer -> _run();  //DellDell在運行!聯想在運行!?>

Demo16.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  //final 如果加在類前面,表示這個類不能被繼承// final class Computer {// }  class Computer {    //final 如果加在方法前面,表示不能夠重寫些方法    final public function _run(){    }  }  class NoteComputer extends Computer {    public function _run(){    }  }  $noteComputer = new NoteComputer();?>

Demo17.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  //建立一個抽象類別,只要在 class 前面加上 abstract 就是抽象類別了  //抽象類別不能夠被執行個體化,就是建立對象  //只在類裡面有一個抽象方法,那麼這個類必須是抽象類別,類前面必須加上 abstract  abstract class Computer {    public $_name = '聯想';    //抽象類別裡建立一個抽象方法    //抽象方法不能夠實現方法體的內容    abstract public function _run();    //我在抽象類別裡能否建立一個普通方法    public function _run2(){      echo '我是父類的普通方法';    }  }  //類不能夠實現多繼承,只支援單繼承。  //抽象類別是給子類用來繼承的,實現一種規範和資源的共用  class NoteComputer extends Computer {    //抽象類別的抽象方法,子類必須重寫,不然會報錯。    //抽象類別裡的普通方法不需要重寫,子類會直接繼承下來    public function _run(){      echo '我是子類的方法';    }  }  $noteComputer = new NoteComputer();  $noteComputer -> _run();  $noteComputer -> _run2();  echo $noteComputer -> _name;?>

Demo18.php

<?php  /*   * 到底應該用抽象類別還是介面呢   * 如果你要繼承多個介面的方法規範,那麼就用介面好了。   * 如果你要共用一個方法體內容,那麼就用抽象類別。   * */  header ( 'Content-Type:text/html; charset=utf-8;' );  //建立一個介面  //介面也不能被執行個體化  //介面是為了規範實現它的子類,以達到統一的目的。也可以共用資料  interface Computer {    //成員欄位必須是變數    const NAME = '成員 ';    //介面裡的所有方法都是抽象方法,不能夠寫方法體    //並且介面的抽象方法不需要寫 abstract    public function _run();    public function _run2();  }  interface Computer2 {    public function _run3();  }  //子類繼承介面的說法,叫做實現,介面可以多實現  class NoteComputer implements Computer,Computer2 {    public function _run() {      echo '我重寫了run';    }    public function _run3() {      echo '我重寫了run3';    }    public function _run2() {      echo '我重寫了run2';    }  }  $noteComputer = new NoteComputer();  $noteComputer -> _run();  $noteComputer -> _run2();  $noteComputer -> _run3();  echo NoteComputer::NAME;  //介面 :: 常量  //echo Computer::NAME;?>

Demo19.php

<?php  header ( 'Content-Type:text/html; charset=utf-8;' );  //什麼叫做多態,字面意思,多種形態  //一個動作由不同的人去執行,而產生不同的效果或者效果,即為多態。  //一個人通過不同的狀態去執行同一種動作,形成不同的效果,也可以稱作為多態。  //園丁    剪    修理花草  //理髮師  剪    理髮  //總裁    剪    裁員  //人   筆記本   運行 win7開機了  //人   台式機   運行 xp開機了  //建立一個介面,來規範啟動並執行方法  interface Computer {    public function version(); //這個方法表示採用什麼電腦    public function work();   //這台電腦是怎麼啟動並執行  }  //建立一個筆記本的類實現介面  class NoteComputer implements Computer {    public function version() {      echo '筆記本';    }    public function work() {      echo '可以攜帶型運行 win7';    }  }  //建立一個台式機的類實現介面  class DesktopComputer implements Computer {    public function version() {      echo '台式機';    }    public function work() {      echo '在工作站運行 XP';    }  }  //建立一個使用者  class Person {    //建立一個方法來接受電腦(膝上型電腦,也可以是台式電腦)    //怎麼接受,將他們的對象傳進來就 OK 啦。    public function _run($type) {      echo '這個人的';      $type -> version();      $type ->work();    }  }  //多態的原理,就是類都寫好了,不要去修改它,只要在類外的調用參數的更改  //而最後的結果也會得到更改,那麼這個就是多態。  //有一個介面,兩個類,一個是筆記本的類,一個是台式機的類  //建立了筆記本  $noteComputer = new NoteComputer();  //建立台式機  $desktopComputer = new DesktopComputer();  //建立一個人  $person = new Person();  //使用電腦  $person -> _run($noteComputer); //這種傳遞,叫做對象引用的傳遞?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.