波哥教你學PHP7之三:PHP數(shù)據(jù)類型

類型

PHP一共有如下類型:

  1. Boolean 布爾類型
  2. integer 整型
  3. float 浮點型,也稱作 double
  4. string 字符串
  5. array 數(shù)組 PHP里用得最多的類型,一定要掌握
  6. object 對象
  7. callable(可調(diào)用)
  8. resource(資源)
  9. NULL(無類型)

在PHP手冊里,還有一些偽類型,這些是為了方便閱讀代碼。

  1. mixed(混合類型)
  2. number(數(shù)字類型)
  3. callback(回調(diào)類型,又稱為 callable)
  4. array|object(數(shù)組 | 對象類型)
  5. 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ù),前面可以正號(+)負號(-)。

  1. 二進制 用0和1來表示一個數(shù)字 數(shù)字前加 0b 例如 0b101 -0b101 0b后面只有0和1
  2. 八進制 用0-7來表示一個數(shù)字 數(shù)字前加 0 例如 0123 -0123
  3. 十進制 用0-9來表示一個數(shù)字 123 -123
  4. 十六進制 用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,然后后期賦值。

  1. 可能直接被賦值為NULL
  2. 可能沒有賦值
  3. 被 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));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 一、php可以做什么 php是一種可以在服務器端運行的編程語言,可以運行在Web服務器端。 php是一門后臺編程語...
    空谷悠閱讀 3,124評論 4 97
  • Sublime Text:一款具有代碼高亮、語法提示、自動完成且反應快速的編輯器軟件,不僅具有華麗的界面,還支持插...
    xiaotao123閱讀 9,509評論 0 27
  • 【這是“心靈·對話”寫作小組第9篇文章】 今天召開了二手車經(jīng)銷商大會,上午主要是向大家介紹了2017年二手車的戰(zhàn)略...
    富足Linda閱讀 236評論 2 0
  • 無論怎么難以相信,我還是走到了2016年的最后一天。 以前總是覺得,十八歲是很遙遠的一件事...
    98一介凡人閱讀 717評論 0 1