求教!PHP物件導向學習
最近在學習PHP物件導向編程的過程中,遇到了些許麻煩,想勞煩大神們為我解答下。
1、類中的靜態變數,使用靜態變數可以減少資源的使用。那麼靜態變數應該用在什麼情況下呢?它與全域變數的異同點又是什麼呢?~(這個讓我很迷茫)。
2、類中的常量。在類中定義的常量與在非類中定義的常量又有什麼優缺點呢?~在什麼樣的情況下需要定義常量呢?~
3、有沒有較好的PHP物件導向執行個體,可以進行學習呢?~若有,請給出相關連結。(不是要基礎的學習,是要稍微深入的類執行個體)
在此,謝謝各位大神了。!!
------解決方案--------------------
《PHP進階程式設計:模式、架構與測試 (高清中文PDF版)》
http://www.verycd.com/topics/2783113/
------解決方案--------------------
類中的靜態變數,使用靜態變數可以減少資源的使用。那麼靜態變數應該用在什麼情況下呢?它與全域變數的異同點又是什麼呢?
可以減少資源的使用?
我的理解是(分兩方面):
0.類的靜態變數分為“類本身的靜態變數”(屬於類),類方法的靜態變數(屬於類,但是定義的位置不一樣)。
1.(儲存空間)靜態變數它屬於整個類,這樣執行個體化很多個物件的時候就可以省下記憶體。
2.(運算時間)從底層來講定址執行個體變數花的時間要比類靜態變數要少一點,但是類方法的靜態變數那就不知道(牛人幫忙解答一下)。
什麼情況下使用?
1.(屬於類的靜態變數)比如一個Person類你想記錄執行個體化了多少個執行個體那用類的靜態變數就能滿足。(如一個地方有多少人口:__construct的時候加一個,__destruct的時候減一個)
2.(屬於類的方法的靜態變數)這種情況主要的“上下文相關”的時候(即本函數上次執行結果會直接或者間接影響本次執行結果的,如四則運算)。
它與全域變數的異同點又是什麼呢?
全域變數顧名思義是全域的。物件導向編程很大的目的是為了實現“高內聚,低耦合”。就比如說人口總數$count 如果用全域變數那麼下次碰到這個總數,那個總數的時候改動就大了;有時候代碼很可能不是你一個人寫的其它人要是也用了這個變數,那豈不是杯具了。。。但是如果使用類靜態變數這個問題就不會有問題(至少每個類有自己的$count)
類中的常量。在類中定義的常量與在非類中定義的常量又有什麼優缺點呢?
類中定義的常量與在非類中定義的常量區別顧名思義就是使用的範圍,比如性別
Person::GENDER_MALE = '男'
Person::GENDER_FEMALE = '女'
Chicken::GENDER_MALE = '公'
Chicken::GENDER_FEMALE = '母'
Cat::GENDER_MALE = '雄'
Cat::GENDER_FEMALE = '雌'
如果定義在全域中定義這兩個常量就照顧的不是那麼周到了。
在什麼樣的情況下需要定義常量呢?
比如人的性別,動物的雌雄等等。如果不定義一個常量就用0|1 ,male|female萬一male打錯了變成mela那不是挺杯具的??而且假設某一天你想把用01表示改為用male和female表示那你要在搜尋千萬行代碼。如果用常量不就是改一下定義的地方就好了。。。
PHP code
#! /usr/bin/php_name = $name; return $this; } public function __construct($name='' , $gender=self::GENDER_MALE){ self::$count++; $this->_name = $name; $this->_genger = $gender; } public function __destruct(){ self::$count--; } public function calc($action='add' , $num=1){ static $sum = 0; if($action == 'add'){ $sum += $num; }else if($action == 'sub'){ $sum -= $num; } echo 'now $sum = ' , $sum , "\n"; return $this; } public function getGender(){ return $this->_gender; } public function setGender($gender=self::GENDER_MALE){ $this->_gender = $gender; }}$ary = array();foreach(range(1 , 100) as $_){ $ary[] = new Person("Person$_");}echo Person::$count , "\n"; ### 100個人unset($ary[15]); ### 銷毀一個echo Person::$count , "\n"; ### 99個人$me = $ary[0]->setName("me");$you = $ary[1]->setName("you");foreach(range(1 , 3) as $_){ ### $me->calc("add" , $_*2); $you->calc("sub" , $_*3); echo "================ \n";}echo $me->setGender(Person::GENDER_FEMALE);echo $me->getGender();
------解決方案--------------------
使用靜態變數可以減少資源的使用???
類的靜態屬性與全域變數的區別在於作用範圍不同
當從一個類執行個體化很多個物件的時候,靜態屬性是公用資料區,也就是各個對象共用的
這與資源的消耗沒什麼關係
同樣的,類常量與常量也只是作用範圍不同
相似的還有,類的靜態方法就是一組作用範圍受限的函數
由於 php5.3 重新引入了命名空間的概念,那些“靜態”的玩意就都將歸位了
學習物件導向的編程,就要用物件導向的方法看問題
不要被那些翻譯的極其糟糕的名詞所迷惑