国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php5類型約束學習筆記

2024-05-04 21:57:19
字體:
來源:轉載
供稿:網友

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. ?> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永丰县| 姜堰市| 县级市| 积石山| 廊坊市| 刚察县| 富平县| 哈巴河县| 文山县| 祁门县| 莱阳市| 常宁市| 清新县| 甘洛县| 淮阳县| 全州县| 休宁县| 万荣县| 罗平县| 乐平市| 西乌珠穆沁旗| 葫芦岛市| 珲春市| 乐业县| 五峰| 吉林市| 宜丰县| 凌云县| 筠连县| 玛纳斯县| 古交市| 东港市| 阿拉善右旗| 高邑县| 江孜县| 崇仁县| 湘阴县| 兴国县| 柘荣县| 苏尼特右旗| 岑溪市|