九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
PHP中的強制類型轉(zhuǎn)換

學(xué)過靜態(tài)語言開發(fā)的朋友對類型轉(zhuǎn)換不會陌生,比如Java、C#、C++等。靜態(tài)語言的好處就是變量強制必須指定類型,這也是編譯的要求,所以大部分編譯型的語言都會有強制變量類型的要求。而PHP據(jù)說也會在PHP8中加入JIT實現(xiàn)編譯功能,并且在7.4中就會引入變量聲明時的類型指定。下面我們先看看目前PHP中的參數(shù)類型及返回值類型的使用。

1function add(int $a, float $b) : int{
2    return (int) $a + $b;
3}

上述代碼中,方法參數(shù)中定義了參數(shù)的類型,包括一個int類型的a和一個float類型的b。然后在方法后面定義了方法的返回值必須是int類型。我們知道,如果計算表達(dá)式中出現(xiàn)了float類型,那么計算結(jié)果會變成float類型。這個方法需要返回的是一個int類型。因此我們使用了一個強制類型轉(zhuǎn)換(int)。在定義了參數(shù)類型和返回值類型后,如果傳遞或者返回的類型不一致,就會報錯。

參數(shù)類型和返回值類型最好在7以上的版本使用?;绢愋腿鏸nt、float等的參數(shù)類型聲明都是7以后才支持的,詳情參見文檔:

https://www.php.net/manual/zh/functions.arguments.php

我們通過(int)、(float)、(bool)等就可以實現(xiàn)PHP的類型強制轉(zhuǎn)換,和C基本上一樣。文檔中關(guān)于可以強制轉(zhuǎn)換的包括如下類型:

  • (int), (integer) - 轉(zhuǎn)換為整形 integer

  • (bool), (boolean) - 轉(zhuǎn)換為布爾類型 boolean

  • (float), (double), (real) - 轉(zhuǎn)換為浮點型 float

  • (string) - 轉(zhuǎn)換為字符串 string

  • (array) - 轉(zhuǎn)換為數(shù)組 array

  • (object) - 轉(zhuǎn)換為對象 object

  • (unset) - 轉(zhuǎn)換為 NULL (PHP 5)

  • (binary) 轉(zhuǎn)換和 b 前綴轉(zhuǎn)換支持為 PHP 5.2.1 新增

(int), (integer)

  • 如果是布爾值,轉(zhuǎn)換結(jié)果為false變成0,true變成1

  • 如果是float,向下取整,如7.99會轉(zhuǎn)換為7

  • 如果是字符串,字符串從頭開始查找,開頭第一個是數(shù)字會直接變成該轉(zhuǎn)換結(jié)果,如果開頭沒有數(shù)字返回0

  • 其他類型轉(zhuǎn)換在文檔中并沒有定義,文檔提示為“沒有定義從其它類型轉(zhuǎn)換為整型的行為。不要依賴任何現(xiàn)有的行為,因為它會未加通知地改變?!?,但我們通過測試,可以發(fā)現(xiàn)對于其他類型的轉(zhuǎn)換是通過多次的類型轉(zhuǎn)換達(dá)成的,比如數(shù)組類型轉(zhuǎn)換為int類型,是根據(jù)數(shù)組是否包含內(nèi)容轉(zhuǎn)換為bool類型后再轉(zhuǎn)換為int類型

1// (int)(integer)
2
3var_dump((int) true); // 1
4var_dump((int) false); // 0
5
6var_dump((int) 7.99); // 7
7
8var_dump((int) "35 ok"); // 35
9var_dump((int) "ok 77"); // 0
10var_dump((int) "ok yes"); // 0
11
12var_dump((int) []); // 0
13var_dump((int) [3,4,5]); // 1

(bool)(boolean)

當(dāng)轉(zhuǎn)換為 boolean 時,以下值被認(rèn)為是 FALSE:

  • 布爾值 FALSE 本身

  • 整型值 0(零)

  • 浮點型值 0.0(零)

  • 空字符串,以及字符串 "0"

  • 不包括任何元素的數(shù)組

  • 特殊類型 NULL(包括尚未賦值的變量)

  • 從空標(biāo)記生成的 SimpleXML 對象

所有其它值都被認(rèn)為是 TRUE(包括任何資源 和 NAN)

這里需要注意的是,負(fù)數(shù)也會是TRUE,只有0是FASLE

1// (bool)(boolean)
2
3var_dump((bool) 0); // false
4var_dump((bool) 1); // true
5var_dump((bool) -1); // true
6
7var_dump((bool) 0.0); // false
8var_dump((bool) 1.1); // true
9var_dump((bool) -1.1); // true
10
11var_dump((bool) ""); // false
12var_dump((bool) "0"); // false
13var_dump((bool) "a"); // true
14
15var_dump((bool) []); // false
16var_dump((bool) ['a']); // true
17
18$a;
19var_dump((bool) $a); // false
20var_dump((bool) NULL); // false

(string)

  • 布爾值,false轉(zhuǎn)換為空字符串"",true轉(zhuǎn)換為"1"

  • int或float類型,轉(zhuǎn)換為字符串形式的字面量,如1轉(zhuǎn)換為"1"

  • 數(shù)組和對象分別轉(zhuǎn)換為"Array"和"Object"字面量

  • 資源類型會被轉(zhuǎn)換為"Resource id #1"形式的字面量

  • NULL轉(zhuǎn)換為空字符串""

直接把 array,object 或 resource 轉(zhuǎn)換成 string 不會得到除了其類型之外的任何有用信息??梢允褂煤瘮?shù) print_r() 和 var_dump() 列出這些類型的內(nèi)容

注:測試結(jié)果,對象類型需要實現(xiàn)__tostring()魔術(shù)函數(shù),否則報錯無法轉(zhuǎn)換為string類型

1// (string)
2
3var_dump((string) true); // "1"
4var_dump((string) false); // ""
5
6var_dump((string) 55); // "55"
7var_dump((string) 12.22); // "12.22"
8
9var_dump((string) ['a']); // "Array"
10class S{
11    function __tostring(){
12        return "S";
13    }
14}
15var_dump((string) new S()); // "S"
16
17var_dump((string) NULL); // ""

(array)

對于任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉(zhuǎn)換為數(shù)組,將得到一個僅有一個元素的數(shù)組,其下標(biāo)為 0,該元素即為此標(biāo)量的值。換句話說(array)scalarValue 與 array(scalarValue) 是完全一樣的

如果一個 object 類型轉(zhuǎn)換為 array,則結(jié)果為一個數(shù)組,其單元為該對象的屬性。鍵名將為成員變量名,不過有幾點例外:整數(shù)屬性不可訪問;私有變量前會加上類名作前綴;保護變量前會加上一個 '*' 做前綴。這些前綴的前后都各有一個 NULL 字符

將 NULL 轉(zhuǎn)換為 array 會得到一個空的數(shù)組

1// (array)
2
3var_dump((array1);
4var_dump((array2.2);
5
6var_dump((array"a");
7
8var_dump((arraytrue);
9
10class Arr
11
{
12    public $a = 1;
13    private $b = 2.2;
14    protected $c = "f";
15}
16class ChildArr extends Arr
17
{
18    public $a = 2;
19    private $d = "g";
20    private $e = 1;
21}
22var_dump((arraynew Arr());
23var_dump((arraynew ChildArr());
24
25var_dump((arraynull);

(object)

如果將一個對象轉(zhuǎn)換成對象,它將不會有任何變化。如果其它任何類型的值被轉(zhuǎn)換成對象,將會創(chuàng)建一個內(nèi)置類 stdClass 的實例。如果該值為 NULL,則新的實例為空。array 轉(zhuǎn)換成 object 將使鍵名成為屬性名并具有相對應(yīng)的值

注意:使用 PHP 7.2.0 之前的版本,數(shù)字鍵只能通過迭代訪問

1// (object)
2
3var_dump((object) 1);
4var_dump((object) 1.1);
5var_dump((object) "string");
6var_dump((object) true);
7var_dump((object) NULL);
8
9var_dump((object) [123]);
10var_dump((object) ["a" => 1"b" => 2"c" => 3]);

(unset)

使用 (unset) $var 將一個變量轉(zhuǎn)換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已

1// (unset)
2
3var_dump((unset1);
4var_dump((unset1.1);
5var_dump((unset"string");
6var_dump((unsettrue);
7var_dump((unsetnull);
8
9var_dump((unset) [123]);
10var_dump((unsetnew \stdClass());

(binary)

將所有類型轉(zhuǎn)換為二進制字符串。二進制字符串是區(qū)別于傳統(tǒng)常用的普通php的Unicode字符串。二進制字符串是字節(jié)字符串,沒有字符集。具體的區(qū)別就類似于數(shù)據(jù)庫中的binary和char類型及blob和text類型

在日常的開發(fā)中基本用不到,了解即可

1// (binary)
2
3var_dump((binary) 1);
4var_dump((binary) 1.1);
5var_dump((binary) "string");
6var_dump((binary) true);
7var_dump((binary) null);
8
9var_dump((binary) [123]);
10var_dump((binary) new S());

以上就是我們的強制類型轉(zhuǎn)換的所有類型,其中有一些類型的轉(zhuǎn)換中提到了資源類型(Resource),但是并沒有資源類型的強制轉(zhuǎn)換。因為資源類型大多是一些句柄操作,如數(shù)據(jù)庫鏈接、文件讀寫等,將其它類型強制轉(zhuǎn)換為資源類型沒有意義。

本文內(nèi)容會經(jīng)常出現(xiàn)在面試題中,而且在實際開發(fā)中的很多邏輯判斷出現(xiàn)的BUG也常常是由于PHP的自動類型轉(zhuǎn)換所導(dǎo)致的,所以這篇文章好好收藏多拿出來看看絕對會讓你有意想不到的收獲哦??!

測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/php%E4%B8%AD%E7%9A%84%E5%BC%BA%E5%88%B6%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2.php

參考文檔:
https://www.php.net/manual/zh/language.types.type-juggling.php#language.types.typecasting

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
php數(shù)據(jù)類型
深入PHP empty(),isset(),is_null()
PHP判斷布爾值的一些常見方法
isset-PHP手冊
php基礎(chǔ)教程-變量
array_rand($arr)//隨機取出數(shù)組的鍵名
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服