程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP的基本常識(2)

PHP的基本常識(2)

編輯:關於PHP編程

對象 OOP
1.Fatal error: Using $this when not in object context
這個錯誤剛學 OOP 肯定容易出現,因為有個概念你沒有真正理解。 類的可訪問性(accessible),也可以說是作用域, 你還可以認為是 1個 中國人 在國外,他不屬於哪個文化,他不講外語(可能他知道點);但是他無法通過自己跟老外溝通,因為他們不是在一個共同國度出生。
那麼錯誤是如何發生的呢?看下面的例子:
 
 1 <?php
 2 class Trones{
 3     static public $fire = "I am fire.";
 4      public $water = "I am water";
 5    
 6     static function getFire( ) {
 7         return $this->fire ; // wrong
 8     }
 9     static function getWater( ) {
10         return $self::water ;  // wrong
11     }
12    
13     static function Fire( ) {
14         return self::$fire ;  // be sure you use self to access the static property before you invoke the function
15     }
16 }
17
18 /*
19 Fatal error: Using $this when not in object context
20 */
21 //echo Trones::getFire( ) ;
22 //echo Trones::getWater( ) ;
23
24 // correct
25 echo Trones::Fire( );
26 echo "<br />" ;
27 $trones = new Trones ;
28 $trones->fire ; // Notice: Undefined property: Trones::$fire (base on defferent error setting) simple is error
29 echo Trones::$fire ;
 
這個錯誤很經典, 也很實用,先看 static 的定義:
Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can).
翻譯:定義一個類的屬性或方法為靜態時,可以使他們在不需要初始化一個類時就能直接訪問 。一個被定義為了靜態的屬性不能被類的對象用對象操作符訪問* -> *,(可以通過靜態的方法訪問)。
例子說明:
7行 10行 犯了同一個錯誤,第一個是用對象操作符來訪問靜態變量。你看看定義,$this 是一個偽變量 相當於 object,一個實例。你用對象操作符 -> 訪問就會報錯。
同樣你也不能用 靜態操作符 :: 來訪問一個公共變量 。 正確的訪問應該是 14行 25行,一個是在類的定義裡訪問(self:: === Trones::),一個是在類的外部訪問。
對於繼承類,以上的規則同樣適合。
------------------------------------------------------ 分割線--------------------------------------------------------------------------------------
2.Fatal error: Call to private method
最近有部連續劇很好看,叫權利的游戲,我們假設有 3方人馬, 7個國王, 平民, 龍女。 他們三方人馬在下面爭奪最終的勝利, 也就是王冠。
下面的故事還有一個標題:類的可見性(visibility) 你如果知道最終的答案,解釋部分你可以略過了。
 
 
 1 <?php
 2
 3 class Trones {
 4     protected $fire = " fire ";
 5     public $water = " water " ;
 6     static private $trones  = "Trones";
 7    
 8     protected function getFire( ) {
 9         $this->fire ;
10     }
11    
12     static public function TheDragenOfMather( ) {
13         return __METHOD__." use ".$this->getFire()." gets the ".self::getTrones( ) ;
14     }
15    
16     static public function getWater( ) {
17         return __METHOD__ ;
18     }
19    
20     static private function getTrones( ) {
21         return  self::$trones ;
22     }
23
24 }
25
26 class Kings extends Trones {
27     static function TheSevenKing( ) {
28         return __METHOD__."gets the ".self::getTrones( );
29     }
30 }
31
32 class People extends Trones{
33     static function ThePeople( ) {
34         return __METHOD__."gets the ".self::getTrones( );
35     }
36 }
37 echo Kings::TheSevenKing( ) ;
38 echo Trones::TheDragenOfMather( ) ;
39 echo People::ThePeople( ) ;
 
 
 
正確答案是:7國征戰 內斗,平民死傷無數,龍女想乘機漁翁得利;可惜 最終誰也沒有得到皇冠和勝利。哈哈。
當static 碰到 private ,結合產生復雜,也產生美;就像抽象的人,像我們大學老師講的數學課;(不過網易的公開數學課很好)
如果想要龍女 獲得最後的勝利, 你只要幫她一把 將13行的 $this->getFire() 這部分去掉就可以了。同樣的道理 你無法在一個靜態函數裡 使用任何對象操作符。
怎麼使人民獲得王冠呢? 你去奮斗吧!
 
如果你不構建大型的框架和網站 這些概念比如 Interface Implement abstract 。。。 你還是不知道的好。

 

 

摘自 warcraft

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