2010-12-05 85 views
26

這些對象調用有什麼區別?PHP:靜態和非靜態函數和對象

非靜態:

$var = new Object; 
$var->function(); 

靜態:

$var = User::function(); 

而且還內class我爲什麼要使用的功能的靜態屬性?

例如:

static public function doSomething(){ 
    ...code... 
} 
+7

-1在我看來,你在過去的幾個問題是關於基本的語言功能。我建議你在PHP手冊或任何一本書讀了第一。多次詢問基本語法的解釋是不適宜 – mario 2010-12-05 22:47:10

+19

@mario。有點苛刻,也許cirk讀過手冊,並沒有完全理解這個概念,似乎很公平的問一些程序員的一些輸入。 – Ben 2010-12-05 22:58:14

回答

33

靜態函數根據定義不能也不依賴於類的任何實例屬性。也就是說,他們不需要類的實例來執行(因此可以按照您在未首先創建實例的情況下顯示的那樣執行)。從某種意義上說,這意味着函數不會(也不會需要)依賴於類的成員或方法(公共或私有)。

7

靜態方法和成員屬於類本身,而不是一個類的實例。

7

靜態函數或字段不依賴於初始化;因此,是靜態的。

7

差異在變量範圍內。想象一下,你有:

class Student{ 
    public $age; 
    static $generation = 2006; 

    public function readPublic(){ 
     return $this->age; 
    } 

    public static function readStatic(){ 
     return $this->age;   // case 1 
     return $student1->age; // case 2 
     return self::$generation; // case 3 

    } 
} 

$student1 = new Student(); 
Student::readStatic(); 
  1. 你靜態函數可以不知道什麼是$這一點,因爲它是靜態的。如果可能有$這個,它將屬於$ student1而不是Student。

  2. 它也不知道什麼是$ student1。

  3. 它確實適用於情況3,因爲它屬於類的靜態變量,與前面的2不同,它屬於必須實例化的對象。

0

有關STATIC功能的問題不斷回來。

靜態函數根據定義不能也不依賴於類的任何實例屬性。也就是說,它們不需要類的實例來執行(因此可以執行)。從某種意義上說,這意味着函數不會(也不會需要)依賴於成員或方法(公共或私有)之類的。

class Example { 

    // property declaration 
    public $value = "The text in the property"; 

    // method declaration 
    public function displayValue() { 
     echo $this->value; 
    } 

    static function displayText() { 
     echo "The text from the static function"; 
    } 
} 


$instance = new Example(); 
$instance->displayValue(); 

$instance->displayText(); 

// Example::displayValue();   // Direct call to a non static function not allowed 

Example::displayText();