首頁 > 軟體

PHP物件導向之封裝,繼承與多型詳解

2022-05-24 18:01:34

在普通的程式設計中,沒有涉及架構或者良好的設計,絕大多數都是使用的程式導向的方式。

當程式設計逐步深入後,就需要合理使用物件導向的知識來設計程式,而不是簡單地腦海裡有了思路就去寫程式碼來實現,這是比較低階的做法。

物件導向的三大特點:封裝、繼承、多型。

封裝、繼承比較好理解,通過一個例子就能看明白:

<?php
class VisualObj{   
	private $Viual=true;
	protected $width;
	protected $height;
	protected $name;
}
class ActiveX extends VisualObj{
	const NamePrefix="ActiveX";
	protected static $count=0;
	public function __construct(string $name,int $width=100,int $height=50){
		$this->width=$width;
		$this->height=$height;
		self::$count=self::$count+1;
		if($name==''||$name==null){
			$this->SetName();
		}else{
			$this->name=$name;
		}
	}
	public function GetName(){
		return $this->name;
	}
	public function SetName(){
		$this->name=self::NamePrefix.$this->GetCount();
	}
	public function GetCount(){
		return self::$count;
	}
	public function GetWidth(){
		return $this->width;
	}
	public function GetHeight(){
		return $this->height;
	}
	public function __destruct(){
		echo "__destruct".$this->GetCount();
	}
}
 
$obj1=new ActiveX('');
echo $obj1->GetName();
echo "<br>";
echo $obj1->GetWidth();
echo "<br>";
echo $obj1->GetHeight();
echo "<hr/>";
$obj2=new ActiveX("新的控制元件",120,60);
echo $obj2->GetName();
echo "<br>";
echo $obj2->GetWidth();
echo "<br>";
echo $obj2->GetHeight();
echo "<hr/>";
?>

靜態變數的理解,以前我們做C/S開發的時候,拖放控制元件到設計介面的時候總是能看到控制元件名字後面的數位是自動累加的,這個就是靜態變數在起作用。

通俗的理解多型就是同樣的方法名和引數名實現不同的功能。

在PHP中通過一個例子就好理解了。

1、通過介面演示

<?php
interface EditObj{
	public function SaveAs();
}
 
class ExcelObj implements EditObj{
	public function SaveAs(){
		echo "編輯Excel的儲存";
	}
}
 
class WordObj implements EditObj{
	public function SaveAs(){
		echo "編輯Word的儲存";
	}
}
 
class PptObj implements EditObj{
	public function SaveAs(){
		echo "編輯Ppt的儲存";
	}
}
 
class app{
	public static function EndEdit($obj){ 
		$obj->SaveAs();
	}
}
 
app::EndEdit(new ExcelObj());
echo "<hr/>";
app::EndEdit(new WordObj());
echo "<hr/>";
app::EndEdit(new PptObj());
echo "<hr/>";
 
class TxtObj{
	public function SaveAs(){
		echo "編輯Txt的儲存";
	}	
}
app::EndEdit(new TxtObj());
 
?>

2、通過(抽象)類演示

<?php
abstract class EditObj{
	public abstract function SaveAs();
	public function OutInfo(){
		echo '輸出資訊';
	}
}
 
class ExcelObj extends EditObj{
	public function SaveAs(){
		echo "編輯Excel的儲存";
	}
}
 
class WordObj extends EditObj{
	public function SaveAs(){
		echo "編輯Word的儲存";
	}
}
 
class PptObj extends EditObj{
	public function SaveAs(){
		echo "編輯Ppt的儲存";
	}
}
 
class app{
	public static function EndEdit($obj){
		$obj->SaveAs();
	}
}
 
app::EndEdit(new ExcelObj());
echo "<hr/>";
app::EndEdit(new WordObj());
echo "<hr/>";
app::EndEdit(new PptObj());
echo "<hr/>";
 
class TxtObj{
	public function SaveAs(){
		echo "編輯Txt的儲存";
	}	
}
app::EndEdit(new TxtObj());
 
?>

可以看到,最後的TxtObj因為有SaveAs方法,也得到了正確的執行。

我們可以加型別限制:

class app{
    public static function EndEdit(EditObj $obj){
        $obj->SaveAs();
    }
}

這樣的話,最後的app::EndEdit(new TxtObj());就會報錯了。

還可以加型別判斷:

class app{
    public static function EndEdit($obj){
        if($obj instanceof EditObj){
            $obj->SaveAs();
        }else{
            echo "輸入的型別錯誤,不能執行!";
        }
        
    }
}

這樣事先的錯誤截斷對使用者就會好一些。

對於上面的介面也一樣可以這樣來做,程式碼也一樣。

到此這篇關於PHP物件導向之封裝,繼承與多型詳解的文章就介紹到這了,更多相關PHP封裝 繼承 多型內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com