PHP面向對象之封裝,繼承與多態詳解

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

當編程逐步深入後,就需要合理使用面向對象的知識來設計程序,而不是簡單地腦海裡有瞭思路就去寫代碼來實現,這是比較低級的做法。

面向對象的三大特點:封裝、繼承、多態。

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

<?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封裝 繼承 多態內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: