淺談PHP面向物件程式設計(一)
傳統的面向過程
將要完成的工作,分作若干個步驟,或再細分為子步驟,然後後步驟從前往後一步一步完成,最初達致目標。
現代的面向物件
將要完成的工作拆分為“一個一個物件”的任務(功能),每個物件獨自完成自己的任務,任務之間的連結通過“呼叫”來實現,最終也完成了整體的工作。
萬事萬物都是物件。
面向物件是設計思想的“昇華”——面向過程是解決簡單問題的自然的思維過程,面向物件是解決大規模的複雜問題的良好思想。
面向物件基本概念
面向物件三大特性:封裝 繼承inherit 多型
類與物件
抽象與具體
張三是一個物件,李四也是一個物件。王五同樣是一個物件。。。。。
他們都隸屬於“人”這個“類”(人類),同時我們也可以 說隸屬於“脊椎動物類”,還可以說屬於動物類,甚至生物。
類:是用於描述“某一些具有共同特徵”的物體的概念,是某一類物體的總稱。
通常,一個類所具有的共同特徵包括2大方面的資訊:
外觀,形狀,描述,資料。。。。。屬性
行為,動作,功能。。。。。。。。方法。
物件:是指一個具體的“物體”,該物體隸屬於某個“類別”(類)。
通常,物件離不開類,沒有類,就不能有物件。
一個類的內部可以有3種程式碼:
屬性
方法
類常量
它們統稱為“類中成員”。
下面我們簡單封裝一個類,並例項化物件
class person{ /*定義屬性*/ var $name="";//var是修飾符,也可以用別的修飾 /*方法*/ function say($name){ echo("我叫".$name); } } $p = new person();//例項化物件 $p->name="張三";//給物件屬性賦值 $p->say("張三");//呼叫物件的方法*
$this是一個“偽物件”,代表當前所屬類的當前物件。
/*定義一個人 類 有年齡 姓名屬性 工作的方法*/ //class man{ // public $name; // public $sex; // public $age; // function summary(){ // echo '我是'.$this->name.',是個'.$this->sex.'生'.',今年'.$this->age.'歲.<br>'; // //$this指的是當前類的當前物件 // } //} // //$p1 = new man();//例項化物件 //$p1->name="夏荷";//給物件屬性賦值 //$p1->sex="女";//給物件屬性賦值 //$p1->age="23";//給物件屬性賦值 //$p1->summary();//呼叫物件的方法*/ // //$p2 = new man();//例項化物件 //$p2->name="萬樹";//給物件屬性賦值 //$p2->sex="男";//給物件屬性賦值 //$p2->age="25";//給物件屬性賦值 //$p2->summary();//呼叫物件的方法*/
靜態屬性 靜態方法
//靜態屬性 與 靜態方法 //class union{ // static $v=10; // var $v1=100; // // static function f1(){ // echo "這是靜態方法"; // } //} // //$p =new union(); //$p->v1;//一般屬性的呼叫 // //echo union::$v;//靜態屬性的呼叫 類名::靜態屬性名 //union::f1();//靜態方法的呼叫 類名::靜態方法名
注意:$this在靜態方法中不能使用 ,靜態方法中也不應呼叫非靜態方法。
構造方法
構造方式是類中的一個“特殊”方法,其作用是在例項化一個物件的同時,給該物件的屬性賦值,使之一建立完成,就具有了其本身的特有資料(屬性值)。
1,該方法名字是固定的,為:__construct();
2,該方法必須是普通方法(不能是靜態方法)
3,通常該方法應該是public
4,通常該方法中使用$this這個關鍵字來對屬性進行賦值
5,當new 類名()的時候,其實是在呼叫該構造方法
6,如果一個類中定義了構造方法,則例項化該類時就會呼叫該方法,且例項化時的引數需要跟構造方法的引數匹配
//構造方法 _construct //普通的我們這樣 //class lemon{ // var $name=""; // var $age=0; // function info(){ // echo $this->name.'的年齡是'.$this->age;//如果物件太多 這樣組織起來的話會很麻煩 // } // //} //$lisi=new lemon(); //$lisi->name='李四'; //$lisi->age=12; //$lisi->info(); //特殊的(運用構造方法)是這樣 //class lemon{ // var $name=""; // var $age=0; // function __construct($name,$age){//構造方法 例項化物件的時候會自動呼叫 作用是初始化資料 //$this->name=$name; //$this->age=$age; //} // function info(){ //echo $this->name.'的年齡是'.$this->age; //} // //} //$hong=new lemon("王小紅","25"); //$hong->info();
類的繼承
簡單理解:
某個類A具有某些特徵,另一個類B,也具有A類的所有特徵,並且還可能具有自己的更多的一些特徵,此時,我們就可以實現:B類使用A的特徵資訊並繼續新增自己的一些特有特徵資訊。
父類有的特性子類一定會有,子類有的特性父類不一定有
class shop_all{ // var $lemon=10; // function show(){ // echo $this->lemon; // } //} //class shop1 extends shop_all{//該句 shoop1 繼承了 shop_all的屬性 // var $lemon ="66";//如果註釋掉就會找到父類的該屬性輸出10 // function show(){//如果註釋掉就會找到父類的該屬性輸出10 // echo "這是show的方法"; // } //} //$fruit =new shop1(); //echo $fruit->lemon; //echo $fruit->show();