這篇文章主要介紹了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); //這種傳遞,叫做對象引用的傳遞?>