您好,登錄后才能下訂單哦!
利用PHP實現一個強制類型轉換功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1function add(int $a, float $b) : int{ 2 return (int) $a + $b; 3}
上述代碼中,方法參數中定義了參數的類型,包括一個int類型的a和一個float類型的b。然后在方法后面定義了方法的返回值必須是int類型。我們知道,如果計算表達式中出現了float類型,那么計算結果會變成float類型。這個方法需要返回的是一個int類型。因此我們使用了一個強制類型轉換(int)。在定義了參數類型和返回值類型后,如果傳遞或者返回的類型不一致,就會報錯。
參數類型和返回值類型最好在7以上的版本使用。基本類型如int、float等的參數類型聲明都是7以后才支持的
我們通過(int)、(float)、(bool)等就可以實現PHP的類型強制轉換,和C基本上一樣。文檔中關于可以強制轉換的包括如下類型:
(int), (integer) - 轉換為整形 integer
(bool), (boolean) - 轉換為布爾類型 boolean
(float), (double), (real) - 轉換為浮點型 float
(string) - 轉換為字符串 string
(array) - 轉換為數組 array
(object) - 轉換為對象 object
(unset) - 轉換為 NULL (PHP 5)
(binary) 轉換和 b 前綴轉換支持為 PHP 5.2.1 新增
如果是布爾值,轉換結果為false變成0,true變成1
如果是float,向下取整,如7.99會轉換為7
如果是字符串,字符串從頭開始查找,開頭第一個是數字會直接變成該轉換結果,如果開頭沒有數字返回0
其他類型轉換在文檔中并沒有定義,文檔提示為“沒有定義從其它類型轉換為整型的行為。不要依賴任何現有的行為,因為它會未加通知地改變。”,但我們通過測試,可以發現對于其他類型的轉換是通過多次的類型轉換達成的,比如數組類型轉換為int類型,是根據數組是否包含內容轉換為bool類型后再轉換為int類型
// (int)(integer) var_dump((int) true); // 1 var_dump((int) false); // 0 var_dump((int) 7.99); // 7 var_dump((int) "35 ok"); // 35 var_dump((int) "ok 77"); // 0 var_dump((int) "ok yes"); // 0 var_dump((int) []); // 0 var_dump((int) [3,4,5]); // 1
當轉換為 boolean 時,以下值被認為是 FALSE:
布爾值 FALSE 本身
整型值 0(零)
浮點型值 0.0(零)
空字符串,以及字符串 "0"
不包括任何元素的數組
特殊類型 NULL(包括尚未賦值的變量)
從空標記生成的 SimpleXML 對象
所有其它值都被認為是 TRUE(包括任何資源 和 NAN)
這里需要注意的是,負數也會是TRUE,只有0是FASLE
// (bool)(boolean) var_dump((bool) 0); // false var_dump((bool) 1); // true var_dump((bool) -1); // true var_dump((bool) 0.0); // false var_dump((bool) 1.1); // true var_dump((bool) -1.1); // true var_dump((bool) ""); // false var_dump((bool) "0"); // false var_dump((bool) "a"); // true var_dump((bool) []); // false var_dump((bool) ['a']); // true $a; var_dump((bool) $a); // false var_dump((bool) NULL); // false
布爾值,false轉換為空字符串"",true轉換為"1"
int或float類型,轉換為字符串形式的字面量,如1轉換為"1"
數組和對象分別轉換為"Array"和"Object"字面量
資源類型會被轉換為"Resource id #1"形式的字面量
NULL轉換為空字符串""
直接把 array,object 或 resource 轉換成 string 不會得到除了其類型之外的任何有用信息。可以使用函數 print_r() 和 var_dump() 列出這些類型的內容
注:測試結果,對象類型需要實現__tostring()魔術函數,否則報錯無法轉換為string類型
// (string) var_dump((string) true); // "1" var_dump((string) false); // "" var_dump((string) 55); // "55" var_dump((string) 12.22); // "12.22" var_dump((string) ['a']); // "Array" class S{ function __tostring(){ return "S"; } } var_dump((string) new S()); // "S" var_dump((string) NULL); // ""
對于任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉換為數組,將得到一個僅有一個元素的數組,其下標為 0,該元素即為此標量的值。換句話說(array)scalarValue 與 array(scalarValue) 是完全一樣的
如果一個 object 類型轉換為 array,則結果為一個數組,其單元為該對象的屬性。鍵名將為成員變量名,不過有幾點例外:整數屬性不可訪問;私有變量前會加上類名作前綴;保護變量前會加上一個 '*' 做前綴。這些前綴的前后都各有一個 NULL 字符
將 NULL 轉換為 array 會得到一個空的數組
// (array) var_dump((array) 1); var_dump((array) 2.2); var_dump((array) "a"); var_dump((array) true); class Arr { public $a = 1; private $b = 2.2; protected $c = "f"; } class ChildArr extends Arr { public $a = 2; private $d = "g"; private $e = 1; } var_dump((array) new Arr()); var_dump((array) new ChildArr()); var_dump((array) null);
如果將一個對象轉換成對象,它將不會有任何變化。如果其它任何類型的值被轉換成對象,將會創建一個內置類 stdClass 的實例。如果該值為 NULL,則新的實例為空。array 轉換成 object 將使鍵名成為屬性名并具有相對應的值
注意:使用 PHP 7.2.0 之前的版本,數字鍵只能通過迭代訪問
// (object) var_dump((object) 1); var_dump((object) 1.1); var_dump((object) "string"); var_dump((object) true); var_dump((object) NULL); var_dump((object) [1, 2, 3]); var_dump((object) ["a" => 1, "b" => 2, "c" => 3]);
使用 (unset) $var 將一個變量轉換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已
// (unset) var_dump((unset) 1); var_dump((unset) 1.1); var_dump((unset) "string"); var_dump((unset) true); var_dump((unset) null); var_dump((unset) [1, 2, 3]); var_dump((unset) new \stdClass());
將所有類型轉換為二進制字符串。二進制字符串是區別于傳統常用的普通php的Unicode字符串。二進制字符串是字節字符串,沒有字符集。具體的區別就類似于數據庫中的binary和char類型及blob和text類型
在日常的開發中基本用不到,了解即可
// (binary) var_dump((binary) 1); var_dump((binary) 1.1); var_dump((binary) "string"); var_dump((binary) true); var_dump((binary) null); var_dump((binary) [1, 2, 3]); var_dump((binary) new S());
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。