怎么看待php 面向对象思想
面向對象的程序設計思路是現代程序設計由面向過程演變面向對象的必然趨勢,所以面向對象的而設計思路必然有它不同的時代意義,必然有著不同面向過程的不同歷史使命,而php 5以后成功添加面向對象的設計思路其實是必然的過程。面向對象的設計主要思路就是將程序和數據封裝在一個叫對象的基本單位之中來提高重用性,靈活性和可擴展性。他同面向過程和函數式編程的設計思路一樣是編程語言的一種范式,是一種規范編程程序的設計方法。只是各自承擔著不同的規范職責而已。
對象是基本單位,對象的封裝需要類來實現,這才能將對象一個個區別開來。對象和類的共同存在的,對象沒有類就像一個家庭沒有人一樣沒有意義,而類沒有對象也就像一個孩子沒有家一樣無法存活。
php的面向對象其實并不會像java或者c++那樣完美展現面向對象的特質,面向對象其實只是php的一個可支持的設計思路,php其實是一種提倡面向過程的的語言,很久以來面向對象的思路不被php程序員接受的,很多人對面向對象的思路表式明顯的排斥,這是面向對象在php不能夠完美的體現的主要原因。
下面具體講講php面向對象的具體實現,
1.類的申明
同樣由class為類的關鍵字,申明類中需要定義變量,定義一個構造函數,php的構造函數的定義不同于其他的語言,統一用一個自帶的神奇函數_construct()來對其函數進行初始化工作。當然也可以定義與之對應的析構函數_destruct(),用于銷毀對象,釋放函數。在類的申明中當需要其他方法,需要在此定義。
2.類的實例化
將申明好的類new創建一個新對象,在內存中分配一個空間給這個類,給這個類去一個新的名字,就這樣這個對象才可以真的的而被使用。
3.使用對象
就像函數的調用一樣,在對象需要的使用對象就可以了,就是對實例化的對象和對象中的屬性或者方法利用對象運算符(->)連接,這樣就可以和函數一樣就行相應的調用。
php的對象實現和其他面向對象語言沒有太大的差異,php中有一些內置的神奇方法,如構造函數_construct()和析構函數_destruct();他們具有特殊意義或功能的方法,無需定義。具有各自特定的功能。常以"_"開頭。
常見的神奇方法:
1._autoload() 自動加載方法,不用知道申明類的文件在哪里,只需要知道文件名,就可以自動加載該文件。這個方法在結構復雜的項目中有著很明顯作用
function _autoload($classname){
include strtolower($classname).'.php';
}
2._set()和_get() 前者用于對象屬性值的設置,后者是用于對象屬性取值。
public function _set($name,$value){
echo "setting $name to $value \r\n";
$this->$name=$value;
}
public function _get($name){
if(!isset($this->$name))
{
echo "未設置";
9 $this->$name="正在為你設置默認值"; }
return $this->$name;
}
3._call()和_callStatic() 前者是為防止調用不可訪問的方法出錯。當調用一個不可訪問的方法時這個方法自動被調用。其原型為:mixed_call(string $name,array $argumets) 其中$name是要調用的方法名,$argumets是包含要傳遞的所有參數的一個數組。
public function _call($name,$arguments)
{
switch(count($arguments)
{
case 2:
echo "$arguments[0]*$arguments[1].PHP_EOL;
break;
case 3:
echo array_sum($arguments).PHP_EOL;
break;
default:
echo '參數不對'.PHP_EOL;
break;
}
}
面向對象中的繼承,組合和多態都是解決程序重復的重要方法,具有公共代碼重用性。下面就談談php類的重用
1.繼承和組合
這是兩個很容易混淆的概念,他們具有很大的相似之處,兩者都是提高代碼的可重用性,只是兩者的設計思路不是不一樣的,類與類之間的關系是不同的,繼承是父與子的關系,而組合是一種需要,整體和局部的關系。就像是父親和家庭的關系。有時候兩種對象之間既可以建立繼承關系又可以建立組合關系。這時候我們是更傾向于使用組合。因為繼承有以下幾個問題:
1.繼承破壞了封裝性,對象的封裝本來就是為了使對象之間相互獨立,各自封裝起來。子類繼承父類所有屬性和方法,但是有時子類并不是繼承父類所有的屬性和方法的。比如父類是鳥類,有飛翔的屬性,但是子類燕子和鴕鳥都繼承了父類的飛行,但是鴕鳥是不具有飛的能力,但是他可以和燕子一樣,這樣無法區別兩個子類,這就不符合類的封裝性。但是組合就很好解決這個問題,鴕鳥并沒有父類的飛的屬性。
2.繼承是緊耦合的, 繼承使子類和父類捆綁在一起,但是組合僅僅通過唯一接口和外部進行通信。
3.繼承擴展復雜,隨著繼承層數增加和子類增加。將涉及大量方法重寫,使用組合可以根據類型約束實現動態組合,減少代碼。
2.多態
顧名思義多態就是多種狀態,多種結果。在php中多態常見于一個父類有兩個不同子類。可以通過父類的不同對象調用不同的子類方法。這就是同一類型,不同結果。
php面向對象還具有接口,反射兩種表現形式,但由于本人對這兩個不是很了解,就不在此斷章取義了。以后再研究。
總之,php不是一個很好的面向對象的語言,但是隨著php的應用越來越廣,我相信面向對象在php中回事越來越重要。
總結
以上是生活随笔為你收集整理的怎么看待php 面向对象思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 检测骨螺钉旋入旋出扭矩性能的仪器介绍
- 下一篇: RSA-CRT leaks__因使用中国