多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > php5類型約束學(xué)習(xí)筆記

php5類型約束學(xué)習(xí)筆記

來源:程序員人生   發(fā)布時(shí)間:2013-10-30 12:36:25 閱讀次數(shù):4015次

php是一種弱類型的編程語言,在php程序中,變量的數(shù)據(jù)類型可以隨著其值的不同而自動(dòng)發(fā)生改變,php也不會(huì)對(duì)變量的數(shù)據(jù)類型進(jìn)行強(qiáng)制檢查或約束.

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

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

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

  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對(duì)象類型,將出現(xiàn)Notice級(jí)別錯(cuò)誤信息,程序仍然繼續(xù)運(yùn)行 
  11.     echo 'Suffix'//仍然會(huì)輸出該文本信息 
  12. ?> 

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

  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對(duì)象類型,引發(fā)Fatal Error致命錯(cuò)誤,程序終止運(yùn)行 
  11.     echo 'Suffix'//不會(huì)輸出該文本信息,程序終止運(yùn)行 
  12. ?> 

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

注意:如果使用類型約束的參數(shù)變量沒有聲明其默認(rèn)值為null,調(diào)用該函數(shù)時(shí)就不能給對(duì)應(yīng)的參數(shù)變量傳遞null值,否則同樣也會(huì)報(bào)錯(cuò)。

類型約束不能用于標(biāo)量類型如 int 或 string。Traits 也不允許。

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

  1. <?php 
  2. //如下面的類 
  3. class MyClass 
  4.     /** 
  5.      * 測試函數(shù) 
  6.      * 第一個(gè)參數(shù)必須為 OtherClass 類的一個(gè)對(duì)象 
  7.      */ 
  8.     public function test(OtherClass $otherclass) { 
  9.         echo $otherclass->var
  10.     } 
  11.  
  12.     /** 
  13.      * 另一個(gè)測試函數(shù) 
  14.      * 第一個(gè)參數(shù)必須為數(shù)組  
  15.      */ 
  16.     public function test_array(array $input_array) { 
  17.         print_r($input_array); 
  18.     } 
  19.     /** 
  20.      * 第一個(gè)參數(shù)必須為遞歸類型 
  21.      */ 
  22.     public function test_interface(Traversable $iterator) { 
  23.         echo get_class($iterator); 
  24.     } 
  25.      
  26.     /** 
  27.      * 第一個(gè)參數(shù)必須為回調(diào)類型 
  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. ?> 

函數(shù)調(diào)用的參數(shù)與定義的參數(shù)類型不一致時(shí),會(huì)拋出一個(gè)可捕獲的致命錯(cuò)誤,代碼如下:

  1. <?php 
  2. // 兩個(gè)類的對(duì)象 
  3. $myclass = new MyClass; 
  4. $otherclass = new OtherClass; 
  5. // 致命錯(cuò)誤:第一個(gè)參數(shù)必須是 OtherClass 類的一個(gè)對(duì)象 
  6. $myclass->test('hello'); 
  7. // 致命錯(cuò)誤:第一個(gè)參數(shù)必須為 OtherClass 類的一個(gè)實(shí)例 
  8. $foo = new stdClass; 
  9. $myclass->test($foo); 
  10. // 致命錯(cuò)誤:第一個(gè)參數(shù)不能為 null 
  11. $myclass->test(null); 
  12. // 正確:輸出 Hello World  
  13. $myclass->test($otherclass); 
  14. // 致命錯(cuò)誤:第一個(gè)參數(shù)必須為數(shù)組 
  15. $myclass->test_array('a string'); 
  16. // 正確:輸出數(shù)組 
  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. ?> 

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

  1. <?php 
  2. // 如下面的類 
  3. class MyClass { 
  4.     public $var = 'Hello World'
  5. /** 
  6.  * 測試函數(shù) 
  7.  * 第一個(gè)參數(shù)必須是 MyClass 類的一個(gè)對(duì)象 
  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. ?> 
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 免费国产在线观看老王影院 | 国产亚洲精品一区999 | 春暖花开亚洲性无区一区二区 | 日本三级日本三级日本三级极 | 亚洲国产欧美在线人成 | 色噜噜狠狠先锋影音久久 | 最近中文字幕免费完整国语 | 老司机一级片 | 在线黄色免费网站 | 亚洲一区二区三区四区 | 亚洲天堂在线视频观看 | 天天做夜夜做久久做狠狠 | 网友自拍视频悠悠在线 | 日韩 欧美 国产 亚洲 中文 | 亚洲图片二区 | 国产精品欧美日韩 | 精品欧美一区二区三区四区 | japanesefree高清日本护士 | 波多野结衣一区二区三区88 | 欧美一级爱操视频 | 日韩高清一级 | 国产午夜精品久久理论片小说 | 激情影院在线视频永久观看 | 全黄大全大色全免费大片 | 在线观看一区二区三区视频 | 亚洲欧洲国产成人综合一本 | 精品久久久久久午夜 | 欧美性高清bbbbbbxxxxx | 亚洲另类视频在线观看 | 国产成人亚洲精品无广告 | www.99精品视频在线播放 | 国产成人精品一区二区免费 | 国产一级一片免费播放视频 | 欧美 国产 小说 另类 | 亚洲第九十七页 | 美女福利视频国产免费观看 | 午夜视频在线观看视频 | 天天拍夜夜添久久精品中文 | 性欧美videofreel另类 | 高清国产性色视频在线 | 国产成在线观看免费视频成本人 |