程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> [開心學PHP100天(七)]精講PHP構造函數:父親和兒子的恩恩怨怨

[開心學PHP100天(七)]精講PHP構造函數:父親和兒子的恩恩怨怨

編輯:關於PHP編程

前戲部分:


一、一句話概括php:

Php就是用來做web應用的,其中這厮很適合做網站,大名鼎鼎的wordpress就是php開發的。Web以外的應用請一定不要考慮用php做。

本文涉及到的一些關鍵詞解釋:

高上大:高端大氣上檔次的簡稱。網絡太盛行,網民實在太懶,說全都不高興


Php的幾個版本:

PHP4 應該說是PHP的裡程碑版本,譬如zend引擎的引入,各種高上大的加速。不過這個版本面向對象太弱,無視php4是對的。

PHP5 如果大家要開發請下載5.3版本,使用最廣泛,相對比較穩定。5.0~5.2請直接刪除,5.4以後請謹慎使用,一個因為還沒普及,一個因為和5.4以前版本兼容不行(網上很多開源的類庫不兼容5.4以後版本)

PHP6 你能下載到我佩服你。


關於PHP的學習:

如果只是想快速學php語法,請使用windows下面的php編譯安裝程序,一鍵安裝配置簡單,不建議直接上手linux學php,等你配置正確後,你對php已經沒興趣了。

如果學會了要裝到商業環境中,請務必學會linux下php的配置和開發。畢竟很多優秀的第三方支持都是原生在linux中的,效率和穩定性也是linux最佳。當然PHP在IIS7中支持的據說也不錯,不過請不要太當真,沒意思的。


二、正文部分:

什麼叫構造函數

每個語言(如java、c#、php)構造函數的特點都有些不一樣。每個對象初始化時能自動執行的一個函數,該函數可以不設置任何內容,但凡你要是設置了一定會自動執行。更主要的你無法在外部去手動調用這個函數。

常規來講,大部分語言的構造函數名和類名是一樣的,這裡PHP是列外,它原來也是這樣的,但是到了php5它雖然還能一樣,但是已經不建議大家使用和類名一樣的函數名了。

為什麼要有構造函數

如果是一個獨立的單類。其實構造函數也就起到“方便”的作用。

譬如:

class A

{

function A()

{

//這裡干一些初始化工作

}

}

這樣有意義嗎?其實沒意義,你完全可以把A()裡面的事情放在外部來調用。

那構造函數到底在何時何地有意義呢?其實是在對象和對象繼承上,舉個故事化的列子

譬如:歷經一年,我終於瘋狗般的開發完成一套很高上大的函數類庫,並自認為這套類庫國內還沒有類似的貨,為了防止別人看懂,我還把類庫結構寫的無比復雜。然後不 小心賣給了多個程序員。但是呢?我很想做一些統計,也就是我想知道有哪些人用了我的類庫,好讓我自我感覺很良好,於是我這麼設計了我的基類庫:

class 牛牛 //這個是高上大類庫名

{

function 牛牛()

{

//這裡偷偷摸摸的把當前用戶的一些本地信息給收集了,偷偷發送到我的郵箱裡,很沒節操有木有?

}

//下面是其他外部可以調用的高上大函數和方法,略

}

這裡我們假設:如果程序員們要想使用我的功能,必須繼承我的類庫,否則你根本看不懂怎麼調用:

Class 小牛 extends 牛牛 //注意這裡直接就是php的繼承寫法了

{

//這裡隨便你搞吧。反正你搞之前都會被我收集到信息,因為父類我已經設定構造函數了。

}

所以大家知道了吧:

1、 構造函數並不是為了方便而產生的

2、 更多的是為了面向對象的結構設計而用

3、 其繼承性、可控性、系統性才是構造函數的主要用途,產品化、商業化是使用它的主要目的

4、 如果大家會IOS開發,大家會看到你寫的視圖如果繼承UITableView,那麼最後你的界面自動就會進行表格的渲染。你想知道蘋果是怎麼實現UITableView的嗎?門都沒有,老老實實繼承,老老實實在我的基礎上寫代碼才是王道。

5、 程序編寫並不是說寫的優雅、優美、藝術、難看懂就是好程序,任何程序的寫法寫的時候主人都是有他自己的目的。同樣,有手腕的老板對你說的每一句話都是有目的的,並不是為了體現他口才有多麼多麼的好

PHP的構造函數的特點

上面的限制看似沒問題,其實還是能破的。那就是PHP中子類繼承父類後,如果子類設定了自己的構造函數,那麼父類的函數不會自動執行。看代碼:

class 小牛 extends 牛牛 //注意這裡直接就是php的繼承寫法了

{

function 小牛()

{

//我有我自己的構造函數,父類就少操心了

}

}

這麼寫那麼我就無法在父類的構造函數中執行“收集信息”的龌龊之舉了。

PHP5中的構造函數特色

大部分語言的構造函數必須和類名相同,事實上上述寫法是PHP4的寫法。到了PHP5人家創始人用__construct 這個函數來代替了,當然,原來的寫法依然兼容

大家來看這麼一個終極寫法吧(為啥叫終極?因為寫到這我太累了,不得不停下來一步寫完)

class father

{

function __construct() //這裡你要麼寫成 function father() 要麼就用__construct

{

echo "父親";

}

}

class child extends father

{

function child()

{

echo "兒子"; //這裡如果child有自己的構造函數了,則不會輸出”父親”

// parent::__construct(); //如果硬要father的構造函數執行,就要這麼干,別無他法

}

}

$child=new child();

以上的構造函數我總結一下:

1、 父親和兒子都是一個祖宗生的,一家人,一脈傳承。

2、 如果兒子沒有成家立業(自己沒有構造函數),那麼兒子對外必須告訴大家他是XX的兒子,否則沒人認識這個兒子(父親的構造函數會強制自動執行

3、 如果兒子長大了,不想讓父親管頭管腳了。那麼他必須得自己成家立業(自己定義構造函數)。對外可以直呼自己是誰了,不用告訴別人他父親是誰(只執行自己的構造函數了)

4、 兒子立業後發現不行,有時還得靠父親帶點人脈來給他接點項目做做。於是只能繼續在外面提他父親的名字(執行parent::__construct()來執行父類的構造函數

下面我們再來看本章最後一段代碼:

class father

{

function __construct() //這裡你要麼寫成 function father() 要麼就用__construct

{

echo "父親";

$this->talk();

}

}

class child extends father

{

function child()

{

echo "兒子"; //這裡如果child有自己的構造函數了,則不會輸出”父親”

parent::__construct(); //如果硬要father的構造函數執行,就要這麼干,別無他法

}

function talk()

{

echo "請幫幫我兒子";

}

}

$child=new child();

先看父類,大家會發現,單獨初始化父類會出錯了,因為父類中沒有talk這個函數。於是只能初始化子類(child),如果執行了parent::__construct(); 則會發現子類中的talk被執行,其實是被父類的構造函數自動執行的。

大家看到這,一定會對php的構造函數有新的看法和認識,其實這真的很有用。我下面接著上面的節奏再用上面的口吻來解釋一下這段代碼:

1、父親終於有一天人老珠黃了,再也不能出去幫兒子接項目了,於是只能呆在家燒燒菜了(父類單獨初始化會出錯

2、兒子仗著以前父親給他帶來的資源橫沖直撞,並很少回去看望父親,對外還稱自己的父親真沒用,差點想再也不回去看望父親

3、終於有一天,兒子在事業上出現大問題了,而這個問題只有他父親的朋友能解決。

4、然而,年邁的父親生病了,整天躺在病床上,為了兒子父親不計前嫌給他朋友寫了封信,囑咐兒子必須給當面交給他朋友才能拆

5、兒子把信交給了他父親的朋友(子類的構造函數強制執行父類的構造函數

6、父親的朋友拆開信,兒子淚眼模糊,信上寫著:請幫幫我的兒子(父類的構造函數自動執行了子類的方法

好吧,php構造函數講的差不多了,其實不光是php,任何現在還在用的開發語言都有它的獨到之處,沒有哪個語言有前途哪個沒前途,只不過領域不同、客戶要求不同、錢不同。


這裡再給大家個建議:寫程序和做人同樣道理,會做人、明事理、有愛心的人一定很受大家歡迎;同樣,會為用戶考慮的程序員,寫出來的代碼一定會被用戶喜歡、領導喜歡、同事崇拜。

引用電影”食神”周星馳的一句話:什麼叫“用心才能做出最好的菜”,這個心並不在具體的某個菜裡,這個心就在這裡,就在生活中,就在你對世界的理解和感悟中。


------------------------------

關注我的微信公眾號,每天成熟一點點
關注步驟:
很直接的拿出手機->打開微信->點掃一掃,掃下面二維碼即可

\

輸入php1、php2、php3、php4 可以在微信中查看講座

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