2016-07-07 23 views
0

這是一個簡單的問題,但我不知道這個術語,所以認爲這個問題會很有用。將傳遞給方法的參數與PHP類一致 - 類型Hinting

在PHP中,我已經看到了這個結構:

Class Class_A{ 
    ... 
    function sampleMethod(Class_B $a){ 
     .. 
    } 
} 
$a = /* some value */; 
$obj = new Class_A; 
$return = $obj->sampleMethod($a); 

我不明白,在參數前綴$aClass_B到方法sampleMethod()的一部分。

問題我有是:

  • ,這是什麼方法正確的術語? (所以我可以研究)
  • 我們是否聲明變量爲 Class_B?
  • $a是否已經是Class_B的對象了?是否存在變量類型$a與Class_B不兼容的條件?

- 編輯:我所尋找的期限爲類型提示 -

+3

你確定這個語法嗎?看起來你正在嘗試[type hinting](http://php.net/manual/en/functions.arguments.php#functions.arguments.type- declare),這是在方法聲明中完成的,而不是在運行時完成的。不同之處在於當你定義方法時:'class A {public function B(C $ c){...}}'方法'B'被定義爲'C'類型的一個參數 –

+0

我編輯了我對未來的評論使用 - 這是Type Hinting,謝謝 –

回答

1

看起來你是在談論type hinting(或實際上,因爲它現在已被命名的類型聲明)。回答您的問題:

  1. 類型聲明或類型提示。這樣命名是因爲你基本上暗示了這個參數需要的是什麼類型的數據。

  2. 我們聲明指定的參數需要是標量類型(內置數據類型如數組,類型,字符串,int等)或指定的類或接口的實例。

  3. 是的,它必須是特定的類型或實現/擴展該類型的類。

這裏是從上面鏈接的手冊,我認爲的例子確實顯示這方面做得很好。

<?php 
class C {} 
class D extends C {} 

// This doesn't extend C. 
class E {} 

function f(C $c) { 
    echo get_class($c)."\n"; 
} 

f(new C); //output: C 
f(new D); //output: D 
f(new E); //output: fatal error argument must be an instance of C 

正如你所看到的,申報所需的類C被傳入傳在C的情況下按預期工作。通過D也適用,因爲D延伸了C,因此即使D可能包含額外的方法/屬性,它也被認爲是C的有效實例。傳入E會導致致命錯誤,因爲它與C無關。

相關問題