日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > php5類型約束學習筆記

php5類型約束學習筆記

來源:程序員人生   發布時間:2013-10-30 12:36:25 閱讀次數:4027次

php是一種弱類型的編程語言,在php程序中,變量的數據類型可以隨著其值的不同而自動發生改變,php也不會對變量的數據類型進行強制檢查或約束.

我們可以參考下面一個簡單的代碼示例:

  1. <?php 
  2.     class Person { 
  3.         
  4.     } 
  5.     $a = 1; //此時,$a為整數類型型(Integer) 
  6.     var_dump($a); 
  7.     $a = 1.0; //此時,$a為浮點類型(Float) 
  8.     var_dump($a); 
  9.     $a = 'CodePlayer'//此時,$a為字符串類型(String) 
  10.     var_dump($a); 
  11.     $a = array('CodePlayer' => 'http://www.111cn.net'); //此時,$a為數組類型(Array) 
  12.     var_dump($a); 
  13.     $a = new Person(); //此時,$a為Person對象類型(Object) 
  14.     var_dump($a); 
  15.     $a = mysql_connect('localhost''username''password');    //此時,$a為資源類型(Resource) 
  16.     var_dump($a); 
  17.     ?> 

php弱數據類型的特點使得php使用起來顯得簡單而靈活,不過,這同樣也是一把達摩克利斯之劍,也正是由于php弱數據類型的特點,在編寫php程序代碼時,開發人員更需要時刻注意變量數據類型的變化,尤其是變量作為函數的參數進行傳遞時,更需要注意這一點,畢竟,大多數的函數參數都只期望是某種特定的數據類型,例如,在下面的例子中,函數sayHi()期望接收的參數類型是Person對象類型,但是,由于php并不是強類型的語言,也不會強制檢查變量的類型,因此我們可以向函數中傳遞任意類型的參數,從而導致程序報錯或邏輯出現異常,實例代碼如下:

  1. <?php 
  2.     class Person { 
  3.         public $name = 'CodePlayer'
  4.         public $age = 3; 
  5.     } 
  6.     function sayHi($person){ 
  7.         echo "Hello! My name is $person->name. I'm $person->age years old."
  8.     } 
  9.     $p = '張三'
  10.     sayHi($p); //不是期望的Person對象類型,將出現Notice級別錯誤信息,程序仍然繼續運行 
  11.     echo 'Suffix'//仍然會輸出該文本信息 
  12. ?> 

從php 5開始,我們就可以使用新增的類型約束機制來對函數參數的部分數據類型進行類型約束。同樣以上面的代碼為例,我們可以在編寫sayHi()函數時要求傳遞進來的參數必須是Person對象類型,否則引發致命錯誤(Fatal Error),并終止當前頁面腳本的運行。要使用php的類型約束機制非常簡單,我們只需要在函數聲明的參數變量前添加指定的類型名稱即可。當我們調用該函數時,php會強制檢查函數的參數是否為指定的類型,如果不是指定的類型則引發致命錯誤,代碼如下:

  1. <?php 
  2.     class Person { 
  3.         public $name = 'CodePlayer'
  4.         public $age = 3; 
  5.     } 
  6.     function sayHi(Person $person){ 
  7.         echo "Hello! My name is $person->name. I'm $person->age years old."
  8.     } 
  9.     $person = '張三'
  10.     sayHi($person); //不是期望的Person對象類型,引發Fatal Error致命錯誤,程序終止運行 
  11.     echo 'Suffix'//不會輸出該文本信息,程序終止運行 
  12. ?> 

值得注意的是,在php 5中,目前只有對象、接口、數組、callable類型的參數變量才能使用類型約束(數組類型是從php 5.1版本開始支持的,callable類型是從php 5.4版本開始支持的)。

注意:如果使用類型約束的參數變量沒有聲明其默認值為null,調用該函數時就不能給對應的參數變量傳遞null值,否則同樣也會報錯。

類型約束不能用于標量類型如 int 或 string。Traits 也不允許。

Example #1 類型約束示例代碼如下:

  1. <?php 
  2. //如下面的類 
  3. class MyClass 
  4.     /** 
  5.      * 測試函數 
  6.      * 第一個參數必須為 OtherClass 類的一個對象 
  7.      */ 
  8.     public function test(OtherClass $otherclass) { 
  9.         echo $otherclass->var
  10.     } 
  11.  
  12.     /** 
  13.      * 另一個測試函數 
  14.      * 第一個參數必須為數組  
  15.      */ 
  16.     public function test_array(array $input_array) { 
  17.         print_r($input_array); 
  18.     } 
  19.     /** 
  20.      * 第一個參數必須為遞歸類型 
  21.      */ 
  22.     public function test_interface(Traversable $iterator) { 
  23.         echo get_class($iterator); 
  24.     } 
  25.      
  26.     /** 
  27.      * 第一個參數必須為回調類型 
  28.      */ 
  29.     public function test_callable(callable $callback$data) { 
  30.         call_user_func($callback$data); 
  31.     } 
  32. // OtherClass 類定義 
  33. class OtherClass { 
  34.     public $var = 'Hello World'
  35. ?> 

函數調用的參數與定義的參數類型不一致時,會拋出一個可捕獲的致命錯誤,代碼如下:

  1. <?php 
  2. // 兩個類的對象 
  3. $myclass = new MyClass; 
  4. $otherclass = new OtherClass; 
  5. // 致命錯誤:第一個參數必須是 OtherClass 類的一個對象 
  6. $myclass->test('hello'); 
  7. // 致命錯誤:第一個參數必須為 OtherClass 類的一個實例 
  8. $foo = new stdClass; 
  9. $myclass->test($foo); 
  10. // 致命錯誤:第一個參數不能為 null 
  11. $myclass->test(null); 
  12. // 正確:輸出 Hello World  
  13. $myclass->test($otherclass); 
  14. // 致命錯誤:第一個參數必須為數組 
  15. $myclass->test_array('a string'); 
  16. // 正確:輸出數組 
  17. $myclass->test_array(array('a''b''c')); 
  18. // 正確:輸出 ArrayObject 
  19. $myclass->test_interface(new ArrayObject(array())); 
  20. // 正確:輸出 int(1) 
  21. $myclass->test_callable('var_dump', 1); 
  22. ?> 

類型約束不只是用在類的成員函數里,也能使用在函數里,代碼如下:

  1. <?php 
  2. // 如下面的類 
  3. class MyClass { 
  4.     public $var = 'Hello World'
  5. /** 
  6.  * 測試函數 
  7.  * 第一個參數必須是 MyClass 類的一個對象 
  8.  */ 
  9. function MyFunction (MyClass $foo) { 
  10.     echo $foo->var
  11. // 正確 
  12. $myclass = new MyClass; 
  13. MyFunction($myclass); 
  14. ?> 

類型約束允許 NULL 值:

  1. <?php 
  2. /* 接受 NULL 值 */ 
  3. function test(stdClass $obj = NULL) { 
  4. test(NULL); 
  5. test(new stdClass); 
  6. ?> 
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久99久久99精品免观看粉嫩 | 国产精品久久久久国产a级 中文字幕影院 | 婷婷亚洲综合 | 日韩av在线一区二区三区 | 1000部精品久久久久久久久 | 成人国产精品视频 | 欧美乱大交做爰xxxⅹ性3 | 亚洲视频在线一区 | 中文字幕国产一区 | 在线播放国产精品 | 中文字幕 视频一区 | v天堂福利视频在线观看 | 成人在线免费电影 | 正在播放国产精品 | 在线观看日韩精品 | 国产成人精品网站 | 99成人免费视频 | 精品国产一区二区三区性色av | 欧美日韩激情视频 | 国产精品2区 | www99| 精品国产乱码久久久久久蜜臀 | 国产色女 | 欧美一区二区久久 | 国产在线视频网 | 亚洲最大色综合成人av | 久久国产精品99久久久久久进口 | 欧洲天堂网 | 欧美成人在线免费视频 | 成人91在线 | www.久| 91精品国产综合久久国产大片 | 亚洲在线一区二区三区 | 污网站免费看 | 国产一二三区在线观看 | h片在线观看视频免费免费 日韩国产一区二区 | 自拍偷拍一区 | 欧美成人高清 | 婷婷综合五月天 | 成人网在线| 国产香蕉视频 |