類型
PHP一共有如下類型:
- Boolean 布爾類型
- integer 整型
- float 浮點型,也稱作 double
- string 字符串
- array 數(shù)組 PHP里用得最多的類型,一定要掌握
- object 對象
- callable(可調(diào)用)
- resource(資源)
- NULL(無類型)
在PHP手冊里,還有一些偽類型,這些是為了方便閱讀代碼。
- mixed(混合類型)
- number(數(shù)字類型)
- callback(回調(diào)類型,又稱為 callable)
- array|object(數(shù)組 | 對象類型)
- void (無類型)
Boolean 布爾類型
布爾類型只有兩個值,常量 TRUE 或 FALSE。兩個都不區(qū)分大小寫。
<?php
/* example_06.php */
$isReady = true; /* 一般來說布爾類型建議用 is 來開頭 */
if ($isReady) {
echo "我準備好了。\n";
} else {
echo "再給點時間準備吧。\n";
}
$isRich = 1; // 大家可以把 $isRich 設置成 "", -1, 2.333, null, "false" 自行測試一下。
if ($isRich) { // 這里會有一個隱性轉(zhuǎn)換,會把 $isRich 由 1 轉(zhuǎn)成 true
echo "我是一個富人。\n";
} else {
echo "我好窮呀。\n";
}
$isOld = 1;
if ($isOld === true) { // 這里是三個等于號,必須類型還有值都一樣才能相等,1雖然等于 true 但類型一個是int 一個是布爾 就不相等
echo "我老了。\n";
} else {
echo "我還年輕。\n";
}
/** 重要 **/
var_dump((bool) false); // bool(false)
var_dump((bool) 0); // bool(false)
var_dump((bool) 0.00); // bool(false)
var_dump((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)
var_dump((bool) array()); // bool(false)
var_dump((bool) []); // bool(false)
var_dump((bool) null); // bool(false)
var_dump((bool) "00"); // bool(true)
var_dump((bool) "0.0"); // bool(true)
var_dump((bool) -1); // bool(true)
var_dump((bool) 1); // bool(true)
var_dump((bool) "abc"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) [12]); // bool(true)
var_dump((bool) NAN); // bool(true)
// 類型判斷
var_dump(is_bool($isRich)); // bool(false)
var_dump(is_int($isRich)); // bool(true)
在Sublime Text 3 下執(zhí)行結(jié)果如下:
我準備好了。
我是一個富人。
我還年輕。
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
if
語句就是布爾類型使用較多的場景,只要 if
括號里的條件為true,那么就執(zhí)行相關的語句。
使用 var_dump 可以打印出各種類型。
if ($isReady) { // 相當于 if ($isReady == true) 的簡寫
if ($isRich) { // 這里會有一個隱性轉(zhuǎn)換,會把 $isRich 由 1 轉(zhuǎn)成 true 相當于 if ((bool) $isReady)
if ($isOld === true) { // 這里是三個等于號,必須類型還有值都一樣才能相等,1雖然等于 true 但類型一個是int 一個是布爾 就不相等
var_dump((bool) ""); // 中的 (bool) 表示強制把 "" 轉(zhuǎn)換成 bool 類型
is_bool() 和 is_int 都是類型判斷函數(shù),返回值為 布爾類型
Integer 整型
Integer 整型,就是初中數(shù)學里定義的整數(shù),有正負之分。
有二進制、八進制、十進制、十六進制等幾種方法來表示整數(shù),前面可以正號(+)負號(-)。
- 二進制 用0和1來表示一個數(shù)字 數(shù)字前加 0b 例如 0b101 -0b101 0b后面只有0和1
- 八進制 用0-7來表示一個數(shù)字 數(shù)字前加 0 例如 0123 -0123
- 十進制 用0-9來表示一個數(shù)字 123 -123
- 十六進制 用0-9加ABCDEF來表示一個數(shù)字 數(shù)字前加 0x 例如 0x1F -0x1F
在32位系統(tǒng)和64位系統(tǒng)里,Integer類型的最大最小值是不一樣的。在特殊情況下,要注意數(shù)據(jù)越界溢出。
<?php
/* example_07.php */
$a = 1234; // 十進制 1234
$b = 0b10011010010; // 二進制 1234
$c = 02322; // 八進制 1234
$d = 0x4d2; // 十六進制 1234
// var_dump 可以同時打印多個變量
var_dump($a, $b, $c, $d);
// 十進制轉(zhuǎn)成二進制字符串
var_dump(decbin($a)); // string(11) "10011010010"
// 十進制轉(zhuǎn)成八進制字符串
var_dump(decoct($a)); // string(4) "2322"
// 十進制轉(zhuǎn)成十六進制字符串
var_dump(dechex($a)); // string(3) "4d2"
// 可以使用 (int) 或者 intval() 來強制把一個類型轉(zhuǎn)成 int 類型
var_dump(22/3); // float(7.3333333333333)
var_dump((int)(22/3)); // int(7)
var_dump(intval(22/3)); // int(7)
var_dump(round(22/3, 2)); // float(7.33) round函數(shù)的第二個參數(shù)為保留小數(shù)點幾位
在Sublime Text 3 下執(zhí)行結(jié)果如下:
int(1234)
int(1234)
int(1234)
int(1234)
string(11) "10011010010"
string(4) "2322"
string(3) "4d2"
float(7.3333333333333)
int(7)
int(7)
float(7.33)
Float 浮點型
Float、Double、Real都是浮點型
<?php
/* example_08.php */
$a = 1.234; // float(1.234)
$b = 1.23e4; // float(12300)
$c = 5E-10; // float(5.0E-10)
var_dump($a, $b, $c);
/* 片斷二 */
$d = (0.1 + 0.7) * 10;
var_dump($d, floor($d));
if ($d == 8) {
echo "我等于8\n";
} else {
echo "我不等于8\n";
}
/* 片斷三 */
/* bccomp 如果兩個數(shù)相等返回0, 左邊的數(shù)大返回1, 左邊小則返回-1. 下面的2為只比較前2位的小數(shù)位 */
if (bccomp($d, 8, 2) === 0) {
echo "我等于8\n";
} else {
echo "我不等于8\n";
}
在Sublime Text 3 下執(zhí)行結(jié)果如下:
float(1.234)
float(12300)
float(5.0E-10)
float(8)
我不等于8
我等于8
大家可以看到片斷二中的代碼理論上應該返回的是相等,但結(jié)果不等。(0.1 + 0.7) * 10 在計算機內(nèi)部,可能是7.999999……所以我們用floor($d)舍去法舍去小數(shù)取整時,返回的是7而不是8。
永遠不要相信浮點數(shù)結(jié)果精確到了最后一位,也永遠不要比較兩個浮點數(shù)是否相等。
如果需要比較,一定要使用任意精度函數(shù)(如BCMath、GMP相關函數(shù)),如上片斷三代碼所示。更多BCMatch函數(shù)請參考這里。
String 字符串
字符串,我們之前在寫第一個程序的時候,echo輸出的就是字符串,可以用如下幾種方式來表達一個字符串。
單引號
不解析里面的變量和特殊字符的轉(zhuǎn)義序列,如下例子中的\t和$name都不會被解析。
/* 單引號 */
$name = '張三';
$str1 = '\t1. 他說:"我叫$name"。';
echo $str1;
echo "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
\t1. 他說:"我叫$name"。
雙引號
會解析變量和特殊字符的轉(zhuǎn)義序列,\t被轉(zhuǎn)成了制表符
/* 雙引號 */
$str2 = "\t2. 他說:\"我叫$name\"。";
echo $str2;
echo "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
2. 他說:"我叫張三"。
heredoc 語法結(jié)構(gòu)
解析規(guī)則同雙引號
/* Heredoc 多行字符串 */
$str3 = <<< EOT
3. 他說:"我叫$name"。
我說:"你就不要騙我了"。
\t他面色一囧。
EOT;
// EOT; 一定要放到最前面,不能有任何空格或者其它字符,“我說”前面的空白也會打出來。
echo $str3;
echo "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
3. 他說:"我叫張三"。
我說:"你就不要騙我了"。
他面色一囧。
nowdoc 語法結(jié)構(gòu)
解析規(guī)則同單引號
/* Heredoc 多行字符串 */
$str4 = <<<'EOT'
4. 他說:"我叫$name"。
我說:"你就不要騙我了"。
\t他面色一囧。
EOT;
// EOT; 一定要放到最前面,不能有任何空格或者其它字符
在Sublime Text 3 下執(zhí)行結(jié)果如下:
4. 他說:"我叫$name"。
我說:"你就不要騙我了"。
\t他面色一囧。
字符串的連接
// 字符串連接
$a = "中國";
$ab = "美國";
$abc = "俄羅斯";
$combine1 = $a . $ab . $abc . '都是大國';
$combine2 = "{$a}{$ab}{$abc}都是大國";
$combine3 = sprintf("%s%s%s都是大國", $a, $ab, $abc);
echo $combine1;
echo "\n";
echo $combine2;
echo "\n";
echo $combine3;
echo "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
中國美國俄羅斯都是大國
中國美國俄羅斯都是大國
中國美國俄羅斯都是大國
使用 {} 來解析復雜的情況
// 字符串連接
$a = "中國";
$ab = "美國";
$abc = "俄羅斯";
// 使用 {} 來解析復雜的情況
// echo "$abcdefd";
echo "{$ab}cdefd";
echo "\n";
$arr = [
'key1' => [
'key2' => 'name'
],
];
echo "5.他說:\"我叫${$arr['key1']['key2']}\"。";
echo "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
美國cdefd
5.他說:"我叫張三"。
把字符串當成數(shù)組處理
第一位是0,第二位是1……
// 把字符串當成數(shù)組處理,第一位是0,第二位是1……
$str5 = 'xyzefg';
echo $str5[0], "\n"; // x
// echo $str5[6], "\n"; // 最大是5,6已經(jīng)越界。PHP Notice: Uninitialized string offset:
在Sublime Text 3 下執(zhí)行結(jié)果如下:
x
字符串轉(zhuǎn)換為數(shù)值的情況
// 字符串轉(zhuǎn)換為數(shù)值的情況
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE); // 以下代碼會大量報錯,暫時屏蔽一下 E_WARNING E_NOTICE 級別錯誤
$v1 = 1 + "10.5"; // float(11.5) "10.5"字符串,轉(zhuǎn)化成了 10.5
$v2 = 1 + "-1.3e3"; // float(-1299) "-1.3e3"轉(zhuǎn)成了數(shù)字-1.3e3,即-1300
$v3 = 1 + "b-1.3e3"; // int(1) 以字母開頭的"b-1.3e3",會被轉(zhuǎn)成0
$v4 = 1 + "b1"; // int(1) 以字母開頭的"b1",會被轉(zhuǎn)成0
$v5 = 1 + "1b10"; // int(2) 以數(shù)字開頭的"1b10",會去除第一個字母及后面所有的內(nèi)容,只保留1
$v6 = 4 + "10.2b100"; // float(14.2) 以數(shù)字開頭的"10.2b100",會去除第一個字母及后面所有的內(nèi)容,只保留10.2
$v7 = "10.0b " + 1; // float(11) 以數(shù)字開頭的"10.0b ",只保留10.0
$v8 = "10.0b " + 1.0; // float(11) 以數(shù)字開頭的"10.0b ",只保留10.0
var_dump($v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
float(11.5)
float(-1299)
int(1)
int(1)
int(2)
float(14.2)
float(11)
float(11)
字符串相關函數(shù)示例
更多字符串函數(shù)見這里
// 字符串相關函數(shù)示例
// 在PHP手冊里有大量以 str 開頭的函數(shù)
$str6 = 'Hello My name is Smith';
// 把 str6 里的小寫 m 替換成 M
echo str_replace('m', 'M', $str6); // Hello My naMe is SMith
echo "\n";
// 把 str6 全部轉(zhuǎn)成大寫
echo strtoupper($str6); // HELLO MY NAME IS SMITH
echo "\n";
// 截取字符串
echo substr($str6, 0, 5); // Hello 從第0個字符開始,截取長度為5的字符
echo "\n";
echo substr($str6, 10, 2); // am 從第10個字符開始,截取長度為2的字符
echo "\n";
// 對于中文的處理
$str7 = '中國,中央之國。';
// 把 str7 里的 "中" 替換成 "美"
echo mb_ereg_replace('中', '美', $str7); // 美國,美央之國。
echo "\n";
// 把 str7 里的
echo mb_substr($str7, 3, 2); // 中央
echo "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
Hello My naMe is SMith
HELLO MY NAME IS SMITH
Hello
am
美國,美央之國。
中央
Array 數(shù)組
PHP里的數(shù)組,相當于其它語言里的數(shù)組、列表、字典、集合、棧、隊列。
數(shù)組有一維數(shù)組,二維數(shù)組,多維數(shù)組。
定義一個數(shù)組
// 老寫法
$arr1 = array(1, 2, 3);
// 新寫法。PHP5.4以后,用 [] 代替 array(),建議用 []
$arr2 = [1, 2, 3];
帶 key 的數(shù)組
$arr2 實際上是有 key 的,相當于如下定義:
$arr2 = [
0 => 1,
1 => 2,
2 => 3,
];
上面最后一行的逗號可以沒有,也可以有。但在多行模式下,保留最好,這樣如果再多加一行的時候,會很方便。
key 可以是 int 或者 string。如果有相同的key,使用最后一個對應的值。
<?php
// 鍵名轉(zhuǎn)換與覆蓋
$arr3 = [
1 => "a",
"1" => "b", // 它也是1
1.5 => "c", // 只能是int或者string 1.5會轉(zhuǎn)化成 1
true => "d", // 它也是1
];
var_dump($arr3);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
array(1) {
[1]=>
string(1) "d"
}
int 與 string 鍵名混合情況下,我們可以到看到a的鍵名是0,b的鍵名是1,因為有100是數(shù)字鍵名,所以c的鍵名就加1成了101了。
// int 與 string 鍵名混合
$arr4 = [
'a',
'name' => 'TFBOYS',
'age' => '16',
'b',
100 => '哈',
'c',
];
var_dump($arr4);
$arr5 = [
10 => 'a',
'b', // key 為 11 自動加 1
'c', // key 為 12
'd', // key 為 13
];
var_dump($arr5);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
array(6) {
[0]=>
string(1) "a"
["name"]=>
string(6) "TFBOYS"
["age"]=>
string(2) "16"
[1]=>
string(1) "b"
[100]=>
string(3) "哈"
[101]=>
string(1) "c"
}
array(4) {
[10]=>
string(1) "a"
[11]=>
string(1) "b"
[12]=>
string(1) "c"
[13]=>
string(1) "d"
}
訪問數(shù)組單元
// 多維數(shù)組及訪問數(shù)組單元
$arr6 = [
100 => 'today',
'name' => '中國人',
'country' => [
'china' => [
'province' => 'Shanghai',
],
],
];
echo $arr6[100] . "\n";
echo $arr6['name'] . "\n";
echo $arr6['country']['china']['province'] . "\n";
在Sublime Text 3 下執(zhí)行結(jié)果如下:
today
中國人
Shanghai
新建、修改、刪除數(shù)組
// 新建、修改、刪除數(shù)組
$arr7 = [];
$arr7['a'] = 'aaa';
$arr7['b'] = 'bbb';
$arr7['c'] = 'ccc';
$arr7[] = 'ddd';
$arr7[] = 'eee';
var_dump($arr7);
// 修改 c 的值
$arr7['c'] = 'ccccc';
// 刪除 ddd 和 bbb
unset($arr7[0], $arr7['b']);
var_dump($arr7);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
array(5) {
["a"]=>
string(3) "aaa"
["b"]=>
string(3) "bbb"
["c"]=>
string(3) "ccc"
[0]=>
string(3) "ddd"
[1]=>
string(3) "eee"
}
array(3) {
["a"]=>
string(3) "aaa"
["c"]=>
string(5) "ccccc"
[1]=>
string(3) "eee"
}
新建、遍歷一維二維數(shù)組
// foreach 遍歷一維數(shù)組
$arr8 = ['a', 'b', 'c', 'd'];
// $arr9 要存在,并且要為數(shù)組,先判斷后使用,是一個好習慣
if (!empty($arr8) && is_array($arr8)) {
foreach ($arr8 as $v) {
echo $v;
}
}
echo "\n";
// foreach 遍歷二維數(shù)組
$arr9 = [];
$arr9[1] = [ // 下標從 1 開始自增
'name' => '小明',
'score' => '98',
];
// 這也是添加一個元素的方式
$arr9[] = [
'name' => '小黃',
'score' => '99',
];
// array_push用于向一個數(shù)組尾部添加一個元素
array_push($arr9, [
'name' => '小紅',
'score' => '100',
]);
var_dump($arr9);
// $arr9 要存在,并且要為數(shù)組,先判斷后使用,是一個好習慣
if (!empty($arr9) && is_array($arr9)) {
foreach ($arr9 as $k => $v) { // $k 表示的是 鍵名
echo "第{$k}條,姓名:{$v['name']},成績:{$v['score']}\n";
}
}
在Sublime Text 3 下執(zhí)行結(jié)果如下:
abcd
array(3) {
[1]=>
array(2) {
["name"]=>
string(6) "小明"
["score"]=>
string(2) "98"
}
[2]=>
array(2) {
["name"]=>
string(6) "小黃"
["score"]=>
string(2) "99"
}
[3]=>
array(2) {
["name"]=>
string(6) "小紅"
["score"]=>
string(3) "100"
}
}
第1條,姓名:小明,成績:98
第2條,姓名:小黃,成績:99
第3條,姓名:小紅,成績:100
數(shù)組函數(shù)
上面有is_array來判斷是否是數(shù)組,array_push用于向一個數(shù)組尾部添加一個元素。下面演示ksort和sort用于排序數(shù)組。更多數(shù)組函數(shù)請參考這里
// 數(shù)組函數(shù)
$arr10 = [
'a' => '5',
'c' => '1',
'b' => '3',
];
ksort($arr10); // 按鍵名來進行排序
var_dump($arr10);
sort($arr10); // 按鍵值來進行排序
var_dump($arr10);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
array(3) {
["a"]=>
string(1) "5"
["b"]=>
string(1) "3"
["c"]=>
string(1) "1"
}
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "3"
[2]=>
string(1) "5"
}
數(shù)組的復制與引用
復制
$arr11 = [1, 2, 3];
$arr12 = $arr11;
$arr12[0] = 4;
var_dump($arr11, $arr12);
在命令行下執(zhí)行結(jié)果如下,可以看到兩個數(shù)組結(jié)果是不一樣的。
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(4)
[1]=>
int(2)
[2]=>
int(3)
}
引用
// 引用
$arr13 = [5, 6 ,7];
$arr14 = &$arr13;
$arr14[0] = 8;
var_dump($arr13, $arr14);
在命令行下執(zhí)行結(jié)果如下,可以看到引用的情況下兩個數(shù)組結(jié)果一樣
array(3) {
[0]=>
int(8)
[1]=>
int(6)
[2]=>
int(7)
}
array(3) {
[0]=>
int(8)
[1]=>
int(6)
[2]=>
int(7)
}
在 foreach 里引用
// 引用并修改值
$arr15 = [
[
'name' => '張三',
'score' => '99',
],
[
'name' => '李四',
'score' => '100',
]
];
foreach ($arr15 as &$v) {
$v['age'] = '16';
}
var_dump($arr15);
在命令行下執(zhí)行結(jié)果如下,可以看到每個數(shù)組元素里均加上了一個age
array(2) {
[0]=>
array(3) {
["name"]=>
string(6) "張三"
["score"]=>
string(2) "99"
["age"]=>
string(2) "16"
}
[1]=>
&array(3) {
["name"]=>
string(6) "李四"
["score"]=>
string(3) "100"
["age"]=>
string(2) "16"
}
}
Object 對象
實有實例化的類都是對象。is_object可以判斷一個變量是否是Object 對象,也可以用 (object)
來強制轉(zhuǎn)成對象。
實例化的類
Class Human {
public function population()
{
echo "世界人口太多了\n";
}
}
$obj1 = new Human();
var_dump(is_object($obj1)); // bool(true)
var_dump($obj1); // object(Human)#1 (0) { }
在Sublime Text 3 下執(zhí)行結(jié)果如下:
bool(true)
object(Human)#1 (0) {
}
數(shù)組轉(zhuǎn)成對象
// 數(shù)組轉(zhuǎn)成對象
$arr1 = [1, 2, 'a' => '333'];
var_dump($arr1);
$obj2 = (object) $arr1;
var_dump($obj2);
var_dump(is_object($obj2));
var_dump($obj2->a);
// 可以遍歷 $obj2 的屬性
foreach ($obj2 as $k => $v) {
var_dump($k .$v);
}
在Sublime Text 3 下執(zhí)行結(jié)果如下:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
["a"]=>
string(3) "333"
}
object(stdClass)#2 (3) {
[0]=>
int(1)
[1]=>
int(2)
["a"]=>
string(3) "333"
}
bool(true)
// foreach 遍歷的結(jié)果
string(3) "333"
int(0)
int(1)
int(1)
int(2)
string(1) "a"
string(3) "333"
字符串轉(zhuǎn)成對象
// 字符串轉(zhuǎn)成對象時,會放在 scalar 標簽下
$str1 = 'abcde';
$obj3 = (object) $str1;
var_dump($obj3);
var_dump($obj3->scalar);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
object(stdClass)#3 (1) {
["scalar"]=>
string(5) "abcde"
}
string(5) "abcde"
Callable / Callback(可調(diào)用)(回調(diào)類型)
在各種語言里,回調(diào)類型都是一種很常見的類型。可以在調(diào)用之前用is_callable來判斷是否是可用的回調(diào)類型。call_user_func和call_user_func_array是較常見的兩種調(diào)用方式。在使用PHP手冊時,參數(shù)類型為 callable 的就要傳遞回調(diào)類型的變量。
<?php
/* example_13.php */
/* 這是一個類 */
Class Human {
public function population($populationNumber)
{
echo "世界人口太多了,目前有{$populationNumber}億了\n";
}
}
$theHuman = new Human();
/* 這是一個匿名函數(shù) */
$closure = function ($MyMoney, $yourMoney) {
echo "我有{$MyMoney}塊,你有{$yourMoney}塊\n";
}; /* 注意這里有一個 ; 號 */
/* 判斷是否是一個可調(diào)用類型 */
var_dump(is_callable($closure));
var_dump(is_callable([$theHuman, 'population']));
/* 一種調(diào)用方式 */
call_user_func([$theHuman, 'population'], 72);
call_user_func($closure, '80', '120');
call_user_func_array($closure, ['100', '50']);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
bool(true)
bool(true)
世界人口太多了,目前有72億了
我有80塊,你有120塊
我有100塊,你有50塊
Resource 資源類型
資源 resource 是一種特殊變量,保存了到外部資源的一個引用,比如打開文件、連接數(shù)據(jù)庫、請求網(wǎng)絡等。
<?php
/* example_12.php */
$handle = fopen('example_12.txt', 'ab');
var_dump(gettype($handle));
var_dump(is_resource($handle));
fclose($handle);
在Sublime Text 3 下執(zhí)行結(jié)果如下:
string(8) "resource"
bool(true)
NULL(無類型)
表示一個變量沒有值。有時候需要顯式的設置一個變量是NULL,然后后期賦值。
- 可能直接被賦值為NULL
- 可能沒有賦值
- 被 unset
<?php
/* example_14.php */
$a = NULL;
$b;
$c = [
'name' => '張三',
];
unset($c['name']);
var_dump(is_null($a));
var_dump(is_null($b));
var_dump(is_null($c['name']));
var_dump($a, $b, $c);
在Sublime Text 3 下執(zhí)行結(jié)果如下:PHP Notice錯誤,說明變量沒有定義。
bool(true)
Notice: Undefined variable: b in D:\xampp\htdocs\phpstudy\example_14.php on line 13
bool(true)
PHP Notice: Undefined variable: b in D:\xampp\htdocs\phpstudy\example_14.php on line 13
PHP Notice: Undefined index: name in D:\xampp\htdocs\phpstudy\example_14.php on line 14
Notice: Undefined index: name in D:\xampp\htdocs\phpstudy\example_14.php on line 14
bool(true)
PHP Notice: Undefined variable: b in D:\xampp\htdocs\phpstudy\example_14.php on line 16
Notice: Undefined variable: b in D:\xampp\htdocs\phpstudy\example_14.php on line 16
NULL
NULL
array(0) {
}
偽類型
偽類型(pseudo-types) 是 PHP 文檔里用于標識參數(shù)可以使用的類型和值。 僅用于PHP手冊及我們代碼中注釋部分。
mixed
mixed 說明一個參數(shù)可以接受多種不同的(但不一定是所有的)類型。
例如 gettype() 可以接受所有的 PHP 類型,str_replace() 可以接受字符串和數(shù)組。
gettype
(PHP 4, PHP 5, PHP 7)
gettype — 獲取變量的類型
描述
string gettype ( mixed $var )
返回 PHP 變量的類型 var.
number
number 說明一個參數(shù)可以是 integer 或者 float。
/**
* 取錢
*
* @param number $amount 數(shù)額
*
*
* @return bool
*/
callback
本文檔中在 PHP 5.4 引入 callable 類型之前使用 了 callback 偽類型。二者含義完全相同。 現(xiàn)在已經(jīng)用callable類型替代
is_callable
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
is_callable — 檢測參數(shù)是否為合法的可調(diào)用結(jié)構(gòu)
說明
bool is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] )
array|object
array|object 意思是參數(shù)既可以是 array 也可以是 object。
void
void 作為返回類型意味著函數(shù)的返回值是無用的。void 作為參數(shù)列表意味著函數(shù)不接受任何參數(shù)。
...
在函數(shù)原型中,$... 表示等等的意思。當一個函數(shù)可以接受任意個參數(shù)時使用此變量名。
var_dump
(PHP 4, PHP 5, PHP 7)
var_dump — 打印變量的相關信息
說明
void var_dump ( mixed $expression [, mixed $... ] )
課堂作業(yè)
檢查大家學的是否認真的作業(yè)題,大家可以在不運行的情況下,明確的知道答案嗎?
<?php
/* example_15.php */
error_reporting(E_ALL ^ E_NOTICE);
$a = false;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = null;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = '';
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = 0;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = '0';
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = 0.0;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = 0.5;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$a = [];
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));
$b;
var_dump(is_null($b));
var_dump(isset($b));
var_dump(empty($b));