2011-05-20 107 views
3

我想知道這兩種方法之間的差異用於初始化類這兩種初始化PHP類的方法有什麼區別?

方法1(使用範圍解析運算符)的對象:

Test::foo(); 

方法2(創建對象的實例) :

$test = new Test; 
$test->foo(); 

這是什麼->運算符叫?

+0

[PHP中 - >和::之間有什麼區別?](http://stackoverflow.com/questions/1804187/what-is-the-difference-between-and-in-php) – 2011-05-20 06:51:27

回答

8

Test::foo()只是靜態調用一個類的方法,它不會對對象做任何事情。它可能會初始化類中的靜態值,但通常不使用靜態初始值設定項。在Singletons的情況下,可以在內部使用靜態初始化程序,但不應該像這樣調用公共靜態初始化程序。

$test = new Test實際上實例一個對象,在該方法中有可能初始化

請注意區別之間初始化(設置對象/類/變量的初始狀態),並且的instantiate(創建從一個類對象實例)。

->T_OBJECT_OPERATOR

+0

可能重複除此之外,如果你正在處理一個單例,你通常會使用靜態初始化器。 – mekwall 2011-05-20 06:53:47

+0

@Marcus什麼是單身人士? – 2011-05-20 06:55:12

+1

@Ibrahim,一個單身人士在任何時候都只能有一個類的單個實例。你可以閱讀更多關於它[這裏](http://php.net/manual/en/language.oop5.patterns.php) – mekwall 2011-05-20 06:58:08

2

::被稱爲 「Paamayim Nekudotayim」(它的希伯來文),->是對象操作:

http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php

也不應該被用來初始化類。有一個神奇的__construct()方法是,它是由new操作自動調用:

http://php.net/manual/en/language.oop5.decon.php

Test::foo()意味着調用方法foo()靜態,實際對象的範圍之外。把它看作某種(慢)名稱空間函數。

$test->foo()表示對象$ test的調用方法foo()

http://www.php.net/manual/en/language.oop5.static.php

-1

我把它叫做一個箭頭......但不同的是,用箭頭的方法,你正在創建一個類的新實例作爲對象,然後可以作爲一個對象引用。另一個只是調用某個類的某種方法。通過這個對象,你可以存儲屬性和調用函數,並將事物存儲在那個對象中,並且你可以調用該對象的多個實例並單獨使用它們......我漫不經心,但有很多事情可以用只調用單獨方法的對象是有限的。

+0

匿名downvote?謝謝。 – spanky 2011-05-20 07:26:33

1

你需要利爾接力(Object Oriented Programming),以及PHP

的內部類的功能此實現,被調用的方法,這種方法可以叫上類的實例,或在靜態模式下,第一次調用,不要創建類*的一個實例,這個調用的方法「富」是靜態的。

class Test { 

    public static $static_atribute; 
    public $normal_atribute; 

    public function Foo($q) { 
     $this->normal_atribute = $q; 
    } 

    public static function SFoo ($q) { 
     // I dont can access to $this 
     self::$static_atribute = $q; 
    } 

} 

Test::Foo("hello"); 
// This thrown an error because $this dont exist in static mode 

Test::SFoo("hello"); 
//This works, and the static property change 

echo Test::$static_atribute; 
// this puts "hello" 

echo Test::$normal_atribute; 
// this thrown an error 

$a = new Test(); 
// $a is an instance of Test 

$a->foo("hello"); 
// this works and the normal_atribute change in THIS instance 

$b = new Test(); 
// $b is anoter instance of Test 

$b->foo("bye"); 
// normal_atribute change in THIS instance 

echo $a->normal_atribute; 
// puts hello 

echo $b->normal_atribute; 
// puts bye 
相關問題