PHP學習4——物件導向

烏雲上發表於2018-08-06

主要內容:

  1. 建立類
  2. 成員方法
  3. 構造方法
  4. 析構方法
  5. 封裝
  6. 繼承
  7. 介面
  8. 多型
  9. 靜態成員
  10. 常用關鍵字
  11. 常用魔術方法

 

從PHP5開始引入了物件導向的全部機制,物件導向的特性符合軟體工程的3個目標:重用性,靈活性,擴充套件性

建立類

類前面不用public修飾,只要class,類的屬性不能在初始化賦值(除非你寫了構造方法來初始化賦值),屬性的使用符號->,比如$aClass->name;

demo.php

<?php
	//宣告ren類,預設public,不寫
	class ren{
		public $name;
		public $sex;
		public $age;
	}
	//例項化ren類
	$xiaoli=new ren();
	//設定name屬性
	$xiaoli->name="小李";
	//獲取name屬性
	echo $xiaoli->name;
	
?>

  輸出

=》小李

 成員方法

就是類中函式,只是在原先的函式宣告前面加修飾符public,即可,呼叫方法$aClass->func(),在函式中使用該物件的屬性使用關鍵字$this,比如$this->name;

class_func.php

<?php
	//宣告ren類,預設public,不寫
	class ren{
		public $name;
		public $sex;
		public $age;
		public function say(){
			echo "我叫做".$this->name."<br/>";
		}
	}
	//例項化ren類
	$xiaoli=new ren();
	//設定name屬性
	$xiaoli->name="小李";
	//呼叫方法
	$xiaoli->say();
	
?>

  輸出

我叫做小李

構造方法

在類的方法中的一個特殊的方法,預設為public(不需要寫),,寫法:__construct(){},注意前面是2個下劃線。

可以使用構造方法進行物件的初始化賦值

每一次例項化物件(new),都會執行。

construct.php

<?php
	//宣告ren類,預設public,不寫
	class ren{
		public $name;
		public $sex;
		public $age;
		//成員方法
		public function say(){
			echo "我叫做".$this->name."<br/>";
			echo "性別:".$this->sex."<br/>";
			echo "年齡:".$this->age."<br/>";
		}
		//構造方法
		function __construct($name,$sex,$age){
			$this->name=$name;
			$this->sex=$sex;
			$this->age=$age;
		}
	}
	//例項化ren類,初始化物件賦值
	$xiaoli=new ren("小李","男",25);

	//呼叫方法
	$xiaoli->say();
	
?>

  輸出

我叫做小李
性別:男
年齡:25

析構方法

和構造方法名稱類似,但是不能帶任何引數,寫法:function __destruct(){}

在銷燬一個類之前執行一些操作或完成功能,在物件被銷燬時自動執行。

destruct.php

<?php
	//宣告ren類,預設public,不寫
	class ren{
		public $name;
		public $sex;
		public $age;
		//成員方法
		public function say(){
			echo "我叫做".$this->name."<br/>";
			echo "性別:".$this->sex."<br/>";
			echo "年齡:".$this->age."<br/>";
		}
		//構造方法
		function __construct($name,$sex,$age){
			$this->name=$name;
			$this->sex=$sex;
			$this->age=$age;
		}
		//析構方法
		function __destruct(){
			echo "<br/>$this->name 這個物件被銷燬了。<br/>";
		}
	}
	//例項化ren類,初始化物件賦值
	$xiaoli=new ren("小李","男",25);

	//呼叫方法
	$xiaoli->say();
	
	//物件自動銷燬,執行__destruct
	
?>

  輸出

我叫做小李
性別:男
年齡:25

小李 這個物件被銷燬了。

  也可以使用unset方法手動銷燬物件,比如$unset($xiaoli)

unset.php

<?php
	//宣告ren類,預設public,不寫
	class ren{
		public $name;
		public $sex;
		public $age;
		//成員方法
		public function say(){
			echo "我叫做".$this->name."<br/>";
			echo "性別:".$this->sex."<br/>";
			echo "年齡:".$this->age."<br/>";
		}
		//構造方法
		function __construct($name,$sex,$age){
			$this->name=$name;
			$this->sex=$sex;
			$this->age=$age;
		}
		//析構方法
		function __destruct(){
			echo "<br/>$this->name 這個物件被銷燬了。<br/>";
		}
	}
	//例項化ren類,初始化物件賦值
	$xiaoli=new ren("小李","男",25);
	$xiaobai=new ren("小白","女",23);
	//呼叫方法
	unset($xiaoli,$xiaobai);
	
	//物件自動銷燬,執行__destruct
	
?>

  輸出

小李 這個物件被銷燬了。

小白 這個物件被銷燬了。

  

封裝

物件導向的3特性:封裝,繼承,多型

封裝是物件導向的3特性之一(3特性為:封裝,繼承,多型)

類封裝了程式碼,物件則封裝了資料

訪問關鍵字:public,private,protected

繼承

這也是物件導向的3特性之一

繼承使用的關鍵字為extends

繼承可以擴充原先的類的屬性和方法,還可以直接使用原先的類的屬性和方法,節省了一大推敲程式碼的時間!

不過繼承的是public,protected的屬性和方法,至於private乃是師傅的私家珍藏(俗稱“留一手”),是不會讓繼承的!

PHP的物件導向的設計,和Java語言的設計非常的類似,難道是copy“借鑑”了Java的嗎?也許吧!

jicheng.php

<?php
	//宣告tool類
	class tool{
		function on(){
			echo "<br/>啟動<br/>";
		}
		function run(){
			echo "執行<br/>";
		}
		function off(){
			echo "關閉<br/>";
		}
	}
	//繼承tool類
	class fan extends tool{
		function app(){
			$this->on();
			$this->run();
			$this->off();
		}
	}
	$fan=new fan();
	$fan->app();
	
?>

  輸出

啟動
執行
關閉

  

介面

PHP5也是單繼承的,只能extends一個類,但是可以實現(相當於繼承)多個介面(介面相當於是所有方法都是抽象方法,抽象類)

介面的關鍵字interface,實現介面implements

interface.php

<?php
	//宣告介面
	interface tool{
		//全都是預設的public abstract 的方法
		function on();
		function run();
		function off();
	}
	//實現介面
	class fan implements tool{
		function on(){
			echo "<br/>風扇啟動<br/>";
		}
		function run(){
			echo "風扇執行<br/>";
		}
		function off(){
			echo "風扇關閉<br/>";
		}
	}

	
?>

多型

由於PHP是弱型別語言,並不支援完全的多型。

多型就是根據不同的物件來做出不同的反應,執行同一個方法,但是得到的卻是不同的結果。

duotai.php

<?php
	//宣告介面
	interface tool{
		//全都是預設的public abstract 的方法
		function on();
		function run();
		function off();
	}
	//實現介面
	class fan implements tool{
		function on(){
			echo "<br/>風扇啟動<br/>";
		}
		function run(){
			echo "風扇執行<br/>";
		}
		function off(){
			echo "風扇關閉<br/>";
		}
	}
	//實現介面
	class engine implements tool{
		function on(){
			echo "<br/>發動機啟動<br/>";
		}
		function run(){
			echo "發動機執行<br/>";
		}
		function off(){
			echo "發動機關閉<br/>";
		}
	}
	//狀態類
	class toolStatus{
		function ts($tool){
			$tool->on();
			$tool->run();
			$tool->off();
		}
	}
	
	
	//應用多型
	$fan=new fan();
	$engine=new engine();
	
	$toolStatus=new toolStatus();
	$toolStatus->ts($fan);
	$toolStatus->ts($engine);
	
?>

  輸出

風扇啟動
風扇執行
風扇關閉

發動機啟動
發動機執行
發動機關閉

靜態成員

類中一種特殊成員,不會被例項化到物件中,所以不用例項化物件即可呼叫。

關鍵字static,比如public static $name,public static function say(){};

在類的內部使用靜態的成員使用關鍵字self::$name,self表示類,2個冒號是作用域限定符,$name就是靜態成員。

在程式中使用靜態成員,寫法:

static.php

<?php
	//宣告tool類
	class tool{
		//宣告靜態方法
		static function on(){
			echo "<br/>啟動<br/>";
		}
		function run(){
			//內部呼叫靜態方法
			self::on();
			echo "執行<br/>";
		}
		function off(){
			echo "關閉<br/>";
		}
	}

	//外部呼叫靜態方法,不用例項化物件
	tool::on();
	$fan=new tool();
	$fan->run();
	
?>

  輸出

啟動

啟動
執行

 常用關鍵字

final,被final(最終的)修飾的類不能被繼承,修飾的屬性不能被修改,比如public final function say(){}

clone,建立一個物件的副本,比如$newClass=clone $aClass;他會自動呼叫類的__clone(){}方法

常用的魔術方法

function  __construct($name,$age){}構造方法

function __destruct(){}析構方法

function __clone(){}拷貝方法

function __set($name,$value)設定方法

function __get($name)獲取方法

function __call($func,$values)

function static __callStatic($func,$values)

 


相關文章