程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php面向對象

php面向對象

編輯:關於PHP編程

php面向對象的特性和java的思想是一樣的,只不過一個是弱類型語言一個是強類型語言,
兩者的實現還是有許多不同點的,功能上也只能點到即止,由於我兩者經常搞混,
於是寫這篇文章來總結一下php的面向對象的一些知識點,
方便日後查詢;

class Person{
	
	var $name;
	private $age;

	function Person(){  //老版構造方法,方法名和類名相同
		// 構造函數在對象生成時首先自動執行的函數,一般用來初始化變量
	}
	function __construct(){  //php5新版構造方法
		
	}
	function __destruct(){  //析構函數
		// 對象失去引用後自動執行的函數(引用放在棧中,對象放在堆中)
	}
	private function study(){
		// 關鍵字private用來聲明私有屬性或方法,私有屬性或方法不能被外部訪問,
		// 只有在類裡面能夠訪問,並且私有的屬性和方法不能被繼承
	}
	protected function study(){
		// 關鍵字protected用來聲明受保護的屬性或方法,受保護的屬性或方法不能被外部訪問,
		// 只有在類裡面能夠訪問,但受保護的的屬性或方法可以被繼承
	}
	public function study(){
		// public聲明共有的方法或屬性,省略不寫的函數或方法都是默認的public
	}

	常用的一些系統方法
	__set() , __get() , __isset() , __unset();
	__toString() , __clone() , __call() , __autoload();

	function __get($name){
		// 當外部試圖訪問對象私有屬性的時候自動調用,並且接受的參數就是外部試圖訪問的屬性名
	}
	function __set($name,$value){
		// 當外部試圖設置對象私有屬性的時候自動調用,並且接受的參數是屬性名和值
	}
	function __isset($name){
		// 當外部使用isset()函數來測試一個對象的私有屬性是否存在時執行的函數,自動接受測試的屬性名
	}
	function __unset($name){
		// 當外部使用unset()函數來試圖刪除一個對象的私有屬性時自動調用,自動接受試圖刪除的屬性名
	}
	function __toString(){
		// 如果直接輸出一個對象的引用(指針)的時候會自動調用本函數
		return str; //必須返回一個字符串
	}
	function __clone(){
		// 如果外部使用clone關鍵字克隆對象($a1=clone $a2)的話會自動調用本函數
		// 可以用來初始化,此時的$this代表新克隆的對象$a1,代表被克隆對象的是$that
		//$a1=clone $a2 區別於$a1=$a2,前者在堆中新創建了一個對象,後者只是同一個對象多了一個指針指向它
	}
	function __call($funName,$argus){
		// 當調用一個對象不存在的方法時自動調用此函數,自動接受參數$funName(不存在的函數名)
		// 參數$argus為數組
	}

	__autoload()函數:
	這個函數不是寫在對象裡面的,是寫在一個php文件的頂部用來自動加載這個php頁面使用到的類
	function __autoload($className){  include $className."php" //組裝成一個完整路徑   }
}

繼承:
	


	class Boy extends Person{
		var $hoby;

		function playgame(){

		}
	}

	php中不支持函數重載,因為弱類型的原因,參數的類型不確定,因為php支持函數動態參數,
	所以參數個數不確定,所以php中只能覆蓋函數(方法重寫)
	方法重寫:在子類方法中加上一句 paret::方法名();就把父類的方法裡面的代碼加入到新方法中了

php面向對象中的常見關鍵字:

	final static const

	final class Person{
		// 加上關鍵字final的類不能被繼承

		final function study(){
			// 使用final關鍵字的函數不能被重載(重寫)
		}

	}

使用static修飾的方法或屬性可以不用實例化對象直接使用類名::方法()或類名::屬性
靜態方法中不能使用非靜態屬性



const修飾常量:const NUM=100;常量名習慣大寫



關鍵字$this和self
前者代表本對象,後者代表本類



對象的串行化和反串行化
	
	串行化:serialize(value)
		參數為對象名,函數的返回值為字符串
	
	反串行化:unserialize(str)
		參數為字符串,函數的返回值為對象
	
	什麼時候使用:1,在網絡傳輸的時候,2,將對象寫入文件或數據庫的時候
	
	部分串行化:
		在對象中添加這個方法:
		function __sleep(){
			$arr = array("name","age"); //將要串行化的屬性以數組的形式傳入
			return $arr;
		}
	在反串行化時自動調用這個方法(如果對象中沒寫則不調用):
		function __wakeup(){
			//類似於__clone(),主要是做一些初始化工作
		}

抽象方法和抽象類:

	抽象方法:abstract function abd();
		只有方法名,沒有方法體
	含有抽象方法的類叫抽象類,也需要使用 abstract 關鍵字修飾

	抽象類就是在普通類的基礎上多了抽象方法

	抽象類不能被實例化,只作為一個規范

	繼承抽象類的類必須實現裡面的抽象方法,否則也是抽象類,不能實例化對象

接口:
	接口的聲明
		interface demo{   

		}

	所有成員屬性必須是常量
	所有方法都是抽象的
	所有成員都必須是 public

	一個類只能繼承一個父類,但是可以實現多個接口

	class one implements two{

	}


php中的多態(和java不同)

	通常php實現多態是這樣的:通常父類是抽象類或者接口由子類去實現,那麼
	子類中就都含有相同的方法名,但是每個子類的實現不同

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