PHP面向?qū)ο笾庋b,繼承與多態(tài)詳解
在普通的編程中,沒有涉及架構(gòu)或者良好的設(shè)計,絕大多數(shù)都是使用的面向過程的方式。
當(dāng)編程逐步深入后,就需要合理使用面向?qū)ο蟮闹R來設(shè)計程序,而不是簡單地腦海里有了思路就去寫代碼來實現(xiàn),這是比較低級的做法。
面向?qū)ο蟮娜筇攸c:封裝、繼承、多態(tài)。
封裝、繼承比較好理解,通過一個例子就能看明白:
<?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/>";
?>靜態(tài)變量的理解,以前我們做C/S開發(fā)的時候,拖放控件到設(shè)計界面的時候總是能看到控件名字后面的數(shù)字是自動累加的,這個就是靜態(tài)變量在起作用。
通俗的理解多態(tài)就是同樣的方法名和參數(shù)名實現(xiàn)不同的功能。
在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方法,也得到了正確的執(zhí)行。
我們可以加類型限制:
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 "輸入的類型錯誤,不能執(zhí)行!";
}
}
}
這樣事先的錯誤截斷對用戶就會好一些。
對于上面的接口也一樣可以這樣來做,代碼也一樣。
到此這篇關(guān)于PHP面向?qū)ο笾庋b,繼承與多態(tài)詳解的文章就介紹到這了,更多相關(guān)PHP封裝 繼承 多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php ignore_user_abort與register_shutdown_function 使用方法
php ignore_user_abort與register_shutdown_function 使用方法小結(jié)。2009-06-06
編寫安全 PHP應(yīng)用程序的七個習(xí)慣深入分析
本篇文章是對編寫安全-PHP應(yīng)用程序的七個習(xí)慣進行了詳細的分析介紹,需要的朋友參考下2013-06-06
PHP獲取數(shù)組中某元素的位置及array_keys函數(shù)應(yīng)用
獲取數(shù)組中一元素的位置有很多方法,其中PHP自身就已經(jīng)內(nèi)置了一個函數(shù)array_keys(),下邊的代碼能夠打印出所有PHP的內(nèi)置函數(shù),感興趣的朋友可以了解下同時學(xué)習(xí)一下函數(shù)array_keys()的使用方法,就當(dāng)鞏固知識量啦2013-01-01
PHP set_time_limit(0)長連接的實現(xiàn)分析
每次我們訪問PHP腳本的時候,都是當(dāng)所有的PHP腳本執(zhí)行完成后,我們才得到返回結(jié)果。如果我們需要一個腳本持續(xù)的運行,那么我們就要通過php長連接的方式,來達到運行目的。2010-03-03
PHP實現(xiàn)刪除多重數(shù)組對象屬性并重新賦值的方法
這篇文章主要介紹了PHP實現(xiàn)刪除多重數(shù)組對象屬性并重新賦值的方法,涉及php結(jié)合sphinx操作數(shù)組元素的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-06-06
PHP開發(fā)環(huán)境配置(MySQL數(shù)據(jù)庫安裝圖文教程)
下載完軟件后開始PHP開發(fā)環(huán)境的配置。注意是開發(fā)環(huán)境,不是服務(wù)器環(huán)境。2010-04-04

