程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP入門教程之面向對象的特性分析(繼承,多態,接口,抽象類,抽象方法等),入門教程多態

PHP入門教程之面向對象的特性分析(繼承,多態,接口,抽象類,抽象方法等),入門教程多態

編輯:關於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); //這種傳遞,叫做對象引用的傳遞
?>

更多關於PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《PHP網絡編程技巧總結》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved