天天看點

PHP學習4——面向對象建立類 成員方法構造方法析構方法封裝繼承接口多态靜态成員 常用關鍵字常用的魔術方法

主要内容:

  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)