PHP5的類型約束
PHP中函數參數有類型約束。那就是,明確要求參數的類型。比如以下代碼:
?
?
var; } /** * 另一個測試函數 * 第一個參數必須為數組 */ public function test_array(array $input_array) { print_r($input_array); }}//另外一個類class OtherClass { public $var = 'Hello World';}?>
?
那麼,類型約束又有什麼關係呢?這裡有一個奇特的問題。那就是:
如果顯式指定參數是某種類型的變數,則參加快PHP的程式效率。為什麼呢?因為,反是對象,PHP5預設是以引用傳遞的。所以,public function test(OtherClass $otherclass) {
這行代碼中,雖沒有引用符號,實際也是引用傳參。
那麼,數組呢?因為,在PHP中我們面對的大資料的類型不外乎三類,對象,數組,字串,而字串是要明確在參數表中使用引用符號(&)的。
數組怎樣,您試一下就明白了。所以,我不多說了!
?
當對象參數被加上類型約束後,仍可以有預設值,成為選擇性參數。如果這樣,函數內部就要判斷,傳入參數是否為NULL。但一般是不需要使用 instanceof這個運算子了。 (此運算子比較特別,如果要否定,必須是?(!(A instanceod B))的形式。?)以下是有預設值的原碼:
?
color=$color; $this->ca = $ca; $this->array = $array; $ca->name=$srcStr; print_r($this); }}$cat=new ca();$cbt=new cb();$cbt->test('test','red'); //這裡我們可以不傳對象$cbt->test('test','blue',$cat); //我們可以傳對象,但數組仍不傳print_r($cat); $cat1=new ca();$arr=array(1,2,3,4,5);$cbt->test('test','black',$cat1,$arr); //數組對象全部傳入array_push($arr,6,7,8,9); //再改變數組print_r($cbt->array); //結果傳入的數組未變。?>
?
?
?
?
?
?
1 樓 dewei 2011-01-25
php5中,對象是不需要引用(&)的,大的數組是需要引用(&)的。
2 樓 tonyseek 2011-01-26
樓主說的類型約束好像也適用於PHP中的Interface
3 樓 renzhen 2011-05-20
dewei 寫道
php5中,對象是不需要引用(&)的,大的數組是需要引用(&)的。
這個完全視乎你代碼的需求,如果你希望函數內參數改變而函數外也變,那就用&,否則不用。
那如果函數內的參數數組不會改變呢?
其實加和不加都沒什麼關係。可能有人會說,不加應用不就是傳值了嗎,大的數組會浪費多少記憶體啊。
其實PHP 5已經對賦值實現了Zero on copy,簡單點說,就是,如果將一個大數組a賦值給b,一開始它們指向的是同一個數組對象,記憶體不會成倍增加,只有當b改變了(加一個元素等操作),PHP底層才會先複製一個新的a數組,然後再做操作。
這種機制極大的提高了傳值賦值的效能,基本上不會影響效能。
詳細的資訊可以去網上找。
4 樓 reeze 2011-06-02
對效率應該是沒有影響的,非要對比,對類型的檢查倒是增加了計算。
最明顯的好處就是能約束介面的使用,減少手動類型檢查的代碼。能規範介面
5 樓 iminto 2011-06-27
bardo 寫道
如果顯式指定參數是某種類型的變數,則參加快PHP的程式效率。
?
說話要付責任的。