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è)簡單的代碼示例:
- <?php
- class Person {
-
- }
- $a = 1;
- var_dump($a);
- $a = 1.0;
- var_dump($a);
- $a = 'CodePlayer';
- var_dump($a);
- $a = array('CodePlayer' => 'http://www.111cn.net'); //此時(shí),$a為數(shù)組類型(Array)
- var_dump($a);
- $a = new Person();
- var_dump($a);
- $a = mysql_connect('localhost', 'username', 'password');
- var_dump($a);
- ?>
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í)例代碼如下:
- <?php
- class Person {
- public $name = 'CodePlayer';
- public $age = 3;
- }
- function sayHi($person){
- echo "Hello! My name is $person->name. I'm $person->age years old.";
- }
- $p = '張三';
- sayHi($p);
- echo 'Suffix';
- ?>
從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ò)誤,代碼如下:
- <?php
- class Person {
- public $name = 'CodePlayer';
- public $age = 3;
- }
- function sayHi(Person $person){
- echo "Hello! My name is $person->name. I'm $person->age years old.";
- }
- $person = '張三';
- sayHi($person);
- echo 'Suffix';
- ?>
值得注意的是,在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 類型約束示例代碼如下:
- <?php
-
- class MyClass
- {
-
-
-
-
- public function test(OtherClass $otherclass) {
- echo $otherclass->var;
- }
-
-
-
-
-
- public function test_array(array $input_array) {
- print_r($input_array);
- }
- }
-
-
-
- public function test_interface(Traversable $iterator) {
- echo get_class($iterator);
- }
-
-
-
-
- public function test_callable(callable $callback, $data) {
- call_user_func($callback, $data);
- }
- }
-
- class OtherClass {
- public $var = 'Hello World';
- }
- ?>
函數(shù)調(diào)用的參數(shù)與定義的參數(shù)類型不一致時(shí),會(huì)拋出一個(gè)可捕獲的致命錯(cuò)誤,代碼如下:
- <?php
-
- $myclass = new MyClass;
- $otherclass = new OtherClass;
-
- $myclass->test('hello');
-
- $foo = new stdClass;
- $myclass->test($foo);
-
- $myclass->test(null);
-
- $myclass->test($otherclass);
-
- $myclass->test_array('a string');
-
- $myclass->test_array(array('a', 'b', 'c'));
-
- $myclass->test_interface(new ArrayObject(array()));
-
- $myclass->test_callable('var_dump', 1);
- ?>
類型約束不只是用在類的成員函數(shù)里,也能使用在函數(shù)里,代碼如下:
- <?php
-
- class MyClass {
- public $var = 'Hello World';
- }
-
-
-
-
- function MyFunction (MyClass $foo) {
- echo $foo->var;
- }
-
- $myclass = new MyClass;
- MyFunction($myclass);
- ?>
類型約束允許 NULL 值:
- <?php
-
- function test(stdClass $obj = NULL) {
- }
- test(NULL);
- test(new stdClass);
- ?>
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)