最近計劃把 PHP手冊,認真的先過一遍。記錄一些之前不知道,不明確的知識。php
【新認知】強制轉換類型用 settype( mixed $var, string $type )
。判斷變量的類型用is_type
函數。例如:數組
if (is_int($an_int)) { $an_int += 4; } if (is_string($a_bool)) { echo "String: $a_bool"; }
判斷變量函數
is_array( mixed $var ) is_bool( mixed $var ) is_float( mixed $var ) is_integer( mixed $var ) is_null( mixed $var ) is_numeric( mixed $var ) //檢測變量是否爲數字或數字字符串 is_object( mixed $var ) is_resource( mixed $var ) is_scalar( mixed $var ) //檢測變量是不是一個標量 integer、float、string 或 boolean is_string( mixed $var )
判斷函數和方法spa
function_exists( string $function_name ) method_exists( mixed $object, string $method_name ) // 判斷類的方法
【遇到坑】(string) '0.00'
被認爲是 True,且不爲空scala
$str = '0.00'; $ret = !empty($str) ? $str : '5.00'; echo $ret; //output:0.00
【遇到坑】當字符串 與 數字比較時,會被轉換爲數字以後進行比較code
//將all轉換爲數字時候爲0 var_dump(0 == 'all'); // TRUE, take care
【新認知】整型的最大值能夠用常量 PHP_INT_MAX
表示orm
【新認知】PHP 沒有像 C++ / JAVA 的整除運算,相似 1 / 2
,PHP 返回 float 0.5對象
【舊回顧】轉換爲整型能夠用(int) 或者 (integer) 強制轉換。或者經過函數 intval()
來轉換。遞歸
【新認知】比較浮點數的方法索引
<?php $a = 1.23456789 $b = 1.23456780 $epsilon = 0.00001 if (abs($a - $b) < $epsilon) { echo 'true'; }
【新認知】使用函數 ord()
和 chr()
實現 ASCII 碼和字符間的轉換(PS:這點和 Python 是同樣的)
【新認知】 PHP 中沒有單獨的「byte」類型,已經用字符串來代替了。
【新認知】 unset()
函數容許刪除數組中的某個鍵,可是數組的鍵不會從新索引。可使用 array_values()
函數從新索引。
【遇到坑】避免數組 $foo[bar]
的寫法,使用 $foo['bar']
【新認知】若是一個object類型轉換爲 array,則結果爲一個數組,其單元爲該對象的屬性。鍵名將爲成員變量名,不過有幾點例外:整數屬性不可訪問;私有變量前會加上類名做前綴;保護變量前會加上一個 '*'
作前綴。這些前綴的先後都各有一個 NULL 字符。
<?php class A { private $A; // This will become '\0A\0A' } class B extends A { private $A; // This will become '\0B\0A' public $AA; // This will become 'AA' } var_dump((array) new B()); ?>
【新認知】 在循環中改變單元,能夠用個引用傳遞來作到
// PHP 5 foreach ($colors as &$color) { $color = strtoupper($color); } unset($color); /* ensure that following writes to
【新認知】轉換爲NULL類型,(unset) $val
【新認知】將字符串文字和變量轉換爲二進制字符串 (PS:和想象中不同)
<?php $binary = (binary)$string; $binary = b"binary string";
【舊回顧】 使用global
,$GLOBALS
來實現全局變量或者超全局變量
【新認知】 靜態變量只能簡單賦值,不能是表達式。靜態變量第一次賦值以後不會再被從新定義,能夠用於遞歸函數的計數。
<?php function test() { static $count = 0; $count++; echo $count; if ($count < 10) { test(); } $count--; } ?>
【新認知】變量名中的點和空格被轉換成下劃線 例如 <input name="a.b" />
變成 $_REQUEST["a_b"]
【新認知】用list()爲嵌套數組解包
<?php $array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { // $a contains the first element of the nested array, // and $b contains the second element. echo "A: $a; B: $b\n"; } ?>
【新認知】break 能夠接受一個可選的數字參數來決定跳出幾重循環。break
至關於 break 1
【新認知】continue 能夠接受一個可選的數字參數來決定跳到幾重循環結尾。continue
至關於 continue 1
【新認知】原來這些變量叫作 魔法常量
__LINE __ __FILE__ __DIR__ __FUNCTION__ __CLASS__ __TARIT__ __MRTHOD__ __NAMESPACE__
【新認知】::class, 使用ClassName::class 能夠得到一個字符串,包含命名空間
<?php namespace NS { class ClassName { } echo ClassName::class; } ?> //output: NS\ClassName
【新認知】接口中能夠定義常量
【新認知】能夠用一個變量來動態調用類,但該變量的值不能爲關鍵詞(self, parent, static)。
【新認知】不能在__toString() 方法中拋出異常,這樣會出現致命錯誤。
【新認知】PHP5 可使用類型約束,函數的參數能夠制定必須爲 對象,接口,數組,callable
【新認知】後期靜態綁定,static:: 再也不被解析爲定義在當前方法所在的類,而是在實際運行時計算。
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 後期靜態綁定從這裏開始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?> //output: B
【新認知】生成器汗水的核心是yield關鍵字。它最簡單的調用形式看起來像一個return聲明,不一樣之處在於普通return會返回值並終止函數的執行,而yield會返回一個值給循環調用今生成器的代碼並且只是暫時執行生成器代碼
<?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { //注意變量$i的值在不一樣的yield之間是保持傳遞的。 yield $i; } } $generator = gen_one_to_three(); foreach ($generator as $value) { echo "$value\n"; } ?>
1 2 3
$GLOBALS $_SERVER $_GET $_POST $_FILES $_REQUEST $_SESSION $_ENV $_COOKIE $php_errormsg //前一個錯誤信息 $HTTP_RAW_POST_DATA //原始POST數據 $http_response_header //HTTP Response Header $argc //argument numbers $argv //argument array
以上