PHP2_PHP語法快速上手2

類型

標量類型

boolean(布爾型)

TEUE | FALSE 不區分大小寫php

<?php
    $foo = True; // 設置 $foo 爲 TRUE
?>

if("0"){
    echo 'true';
}else{
    echo 'false';  // 輸出 false
}


if("0.0"){
    echo 'true';    // 輸出 true
}else{
    echo 'false';
}

要將一個值轉換成 boolean,用 (bool) 或者 (boolean) 來強制轉換。
可是不少狀況下不須要用強制轉換,由於當運算符,函數或者流程控制結構須要一個 boolean 參數時,PHP 具備類型自動轉換。java

當轉換爲 boolean 時,如下值被認爲是 FALSE:mysql

  • 布爾值 FALSE 自己
  • 整型值 0(零)
  • 浮點型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的數組
  • 特殊類型 NULL(包括還沒有賦值的變量)
  • 從空標記生成的 SimpleXML 對象

全部其它值都被認爲是 TRUE(包括任何資源 和 NAN)。算法

Warning
-1 和其它非零值(不論正負)同樣,被認爲是 TRUE!sql

integer(整型)

PHP 支持 十進制、二進制、八進制、十六進制;數據庫

$a = 1234; // 十進制數
$a = -123; // 負數
$a = 0123; // 八進制數 (等於十進制 83)
$a = 0x1A; // 十六進制數 (等於十進制 26)
$a = 0b11111111; // 二進制數字 (等於十進制 255)

整型數的長度和平臺有關;
Windows 下 ,PHP 7 之前的版本,都是 32 位版本的PHP。
PHP 不支持無符號的 integer。segmentfault

Integer 值的佔用字節長度能夠用常量 PHP_INT_SIZE 來查看;api

最大值能夠用常量 PHP_INT_MAX 來表示,最小值用常量 PHP_INT_MIN 表示。數組

32位的範圍: -2147483648 ~ 2147483647 app

64位的範圍: -9223372036854775808 ~ 9223372036854775807

超過 Integer 範圍的 數,溢出了範圍,會被自動轉換爲 浮點數;待會講浮點數的時候會具體說明緣由
(一樣,計算的結果若是溢出了範圍,也會被自動轉換爲浮點數)

在PHP中,進行除法運算會返回浮點數或者整數,若是能夠整除則返回整數,若是不能整除則返回小數;

若是想要像其餘語言同樣,在計算除法的時候,捨棄掉小數部分,能夠進行強制轉換(int) 強制轉換爲整數,強制轉換爲整數的時候會向下取整(砍掉小數)

GMP擴展
若是 內建 Integer 的範圍不夠使用(特別是32位狀況下),可使用任意長度整數gmp庫,須要在php的配置文件中開啓;

(GMP庫是任意長度整數庫,不支持浮點數運算)

函數庫使用方法: https://www.php.net/manual/zh...

echo gmp_strval(gmp_add("99999999999999999999999999999999999999999999999","1"));
float(浮點型,也稱做 double)
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;

和其餘語言同樣,PHP支持科學記數法,PHP中全部的浮點數對應其餘語言的 double ,佔用 8字節(64位)。

符號位 階碼 尾數 長度 精度
float 1 8 23 32 有效數字支持6~7位
double 1 11 52 64 有效數字支持14~15位

Tip: 一個浮點數的有效數字是指從左邊第一位不是0的數開始計數;
如: 0.00123,有效數字是 123,則有三位有效數字;

PHP 中 浮點數 能夠精確表達 有效數字 爲 14~ 15的小數,超過14~15位,則沒法精確表達,使用科學計數法,粗略表述;

因爲浮點數是非精確描述數字,因此範圍很是的龐大,整數溢出了範圍,則會被自動轉換爲 浮點數,浮點數粗略表示,因此若是龐大的數字,仍是要使用 GMP 庫,任意長度整數


浮點數在平常使用過程當中,常常會出現一些怪異的狀況,這種狀況在其餘語言都有可能出現,如
0.7+0.1 的結果不是 0.8,而是 0.799999999;
(0.7+0.1) * 10 的結果不是 8,而是 7;
爲何會產生這樣的問題? 如何解決? 若是想要了解詳細的原理,能夠看我另外的文章(浮點數)

這裏咱們直接說結論,永遠不要相信浮點數的計算結果; 可使用下面兩種方式:

  1. 統一使用整數存儲;如: 能夠講餘額存成整數,單位爲「分」,11.31元存成 1131分;
  2. 使用 BCMath 庫 (任意精度數學庫) 值得信賴的精度計算~

BCMath 使用案例

echo bcadd("0.1232132132132132132121" , "0.12321321321321321323213213213",20); 

// 輸出 0.24642642642642642644 

// 參數: 字符串A,字符串B,保留小數位數
// 返回: 字符串計算結果

判斷浮點數相等
通常不要簡單判斷浮點數是否相等,由於這是一個坑!浮點數自己是不精確的,0.7 實際是 0.70000000000001; 可使用下面這種方法判斷相等;

// $a 和 $b 在小數點後五位精度內都是相等的。 則斷定相等
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}

對於這種下面這種超大極限數狀況,上面的比較算法就會出現錯誤,知道這是爲何嗎? ~

$a = 12345678998989899899.129;
$b = 12345678998989899888.123;
$epsilon = 0.00001;

echo  $a  ;
echo  '<br/>';
echo  $b  ;

if(abs($a-$b) < $epsilon) {
    echo "true";  // 仍是會輸出 true ,其實上面兩個數已是天壤之別
}

小數的比較仍是推薦使用: bccomp() 函數來解決

總結:

  1. 小數的計算結果永遠不要信任(除非使用高精度函數庫)
  2. 有效位數超過13位的,就不精確了,若是想要精確要使用 高精度函數庫
  3. 推薦使用高精度函數庫來處理小數的計算, 高精度小數的表示與輸出;
內建數學函數庫 Math

PHP 也提供了 數學函數庫 Math ,這些函數是內建的;能夠直接使用;

請參照: PHP Math 函數庫官方文檔

string(字符串)

PHP中有4中方式(2組) 表示字符串;

  1. 單引號
  2. nowdoc
  3. 雙引號
  4. hredoc

單引號和 nowdoc 爲一組,他們不支持 變量解析 也不支持 轉義字符,相似於 raw 字符串;

單引號和 nowdoc 也是有區別的; 單引號常備用做表示一行字符串, nowdoc 被用做表示一段字符串;

單引號表示字符串的時候,能夠有部分轉義支持(輸出單引號和反斜槓);而 nowdoc則沒有任何轉義支持;

單引號和nowdoc 能夠被用做初始化類屬性

單引號字符串

// 單引號
echo 'this is a simple string';

// 能夠錄入多行
echo 'You can also have embedded newlines in 
strings this way as it is
okay to do';

// 輸出: Arnold once said: "I'll be back" ; 支持 \' 轉義輸出 單引號
echo 'Arnold once said: "I\'ll be back"';
// 輸出: You deleted C:\*.*? ;
// 支持 \\ 轉義輸出 1個反斜槓
echo 'You deleted C:\\*.*?';

// 輸出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// 輸出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// 輸出: Variables do not $expand $either
echo 'Variables do not $expand $either';

nowdoc

如下內容會被原封不動的輸出~ 不會有任何的轉義

語法上要注意, EOT 要帶 單引號,(不帶帶引號就變成了 heredoc); EOT 是能夠自定義的,就是個標記而已; EOT的開頭和結尾要一致; EOT 的結尾必須頂行寫;

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
'' 
\\
\'
EOT;

雙引號和 heredoc 爲一組; 他們支持變量解析和轉義字符(\n,\r,\0,\u,\t ..等);

(存在變量解析的 雙引號字符串 或 heredoc ,不能夠被用做類屬性初始化; 沒有變量解析的可被用作類屬性初始化)

heredoc

$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* 含有變量的更復雜示例 */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

// heredoc 中含表達式
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;


// 在參數中使用 heredoc
var_dump(array(<<<EOD
foobar!
EOD
));

雙引號和變量解析

簡單示例:

$juices = array("apple", "orange", "koolaid1" => "purple");

echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;

// 不工做,由於 和 s 粘在一塊兒了,沒法解析
echo "He drank some juice made of $juice[0]s.".PHP_EOL;  

// 正常工做,不須要''來表示字符串key
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;

class people {
    public $john = "John Smith";
    public $jane = "Jane Smith";
    public $robert = "Robert Paulsen";
    
    public $smith = "Smith";
}

$people = new people();

echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;

// 不會工做,找不到 smiths 的屬性
echo "$people->robert greeted the two $people->smiths.";

複雜示例

$great = 'fantastic';

// 無效,輸出: This is { fantastic}
echo "This is { $great}";

// 有效,輸出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// 有效
echo "This square is {$square->width}00 centimeters broad."; 

// 有效,只有經過花括號語法才能正確解析帶引號的鍵名
echo "This works: {$arr['key']}";

// 有效
echo "This works: {$arr[4][3]}";

// 這是錯誤的表達式,由於就象 $foo[bar] 的格式在字符串之外也是錯的同樣。
// 換句話說,只有在 PHP 能找到常量 foo 的前提下才會正常工做;這裏會產生一個
// E_NOTICE (undefined constant) 級別的錯誤。
echo "This is wrong: {$arr[foo][3]}"; 

// 有效,當在字符串中使用多重數組時,必定要用括號將它括起來
echo "This works: {$arr['foo'][3]}";

// 有效
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

// 無效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";

也能夠在字符串中用此語法經過變量來調用類的屬性。

class foo {
    var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";

只有和字符串在同一個命名空間下的 變量,纔會被解析;

PHP 字符串的本質

PHP中的字符串是字節數組,字節從哪裏來?

PHP解析器會根據 PHP腳本文件的編碼,對代碼進行解碼和解析;

$str = "a你好b"; ,即假設文件編碼爲 UTF-8,則 str 在內存中的編碼則是 UTF-8,UTF-8是可變長度編碼,因此 a 佔 1個字節,「你好」佔6個字節(1個漢子3字節),b佔1個字節,總共8個字節;

這和其餘語言有很大的不一樣, 在Java中,Java虛擬機的字符串是由字符組成,而不是字節;字符編碼是UTF-16 ;

Class文件在用 java 命令運行的時候,能夠指定編碼,告訴Java虛擬機,以什麼編碼解析 Class 中的字符串;如: UTF-8 解析,則用UTF-8編碼解析,解碼成 unicode 序列,再將unicode序列,編碼成UTF-16 序列,造成字符串;

因此,在PHP中, a你好b 的長度是8;在Java中它的長度是4;


然而,PHP 的絕大部份內部字符串處理函數其實都是針對單字節的,好比常見的 strlen(),substr(),strpos(),strcmp()......若是應用這些函數對多字節字符處理,可能會獲得預想不到的結果; 以下代碼:

$str = "a你好b";
echo $str[0]; // 輸出 a
echo $str[1] ; // 輸出亂碼~ 由於 下標爲1的字節,不是一個字符編碼,而是 你 字的UTF-8碼 的 1/3;

mbstring 擴展

函數文檔地址: https://www.php.net/manual/zh...

前文說到,自帶的字符串處理函數都是以字節爲單位來處理的,在英文國家可能很是好用,可是在中國,一個漢子3個字節的時候,就很差用了;

可使用 mbstring 擴展,來進行平常的字符串操做:

$str = "a你好b";
echo mb_substr($str,1,1);  // 輸出 你

mbstring 若是沒有開啓須要在 配置文件中開啓; 常見的配置項以下,主要就是配置默認的字符編碼;

[mbstring] 
mbstring.language = Chinese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8
mbstring.detect_order = UTF-8
mbstring.substitute_character = none

每個 mbxxx函數的最後一個都是 encoding ,能夠指定 解析 字符串(字節數組) 所使用得編碼,若是不填則使用配置編碼;

編碼能夠在上述的配置文件中配置,若是沒有配置,則默認是使用PHP配置中的

; PHP's default character set is set to UTF-8.
; http://php.net/default-charset
default_charset = "UTF-8"

輸出的區別 print、printf、var_dump等

echo 和 print: 都是輸出,可是 echo 比 print 快建議用 echo;

print_r函數打印關於變量的易於理解的信息
若是變量是string , integer or float , 將會直接輸出其值,若是變量是一個數組,則會輸出一個格式化後的數組,便於閱讀;
也就是有key和value對應的那種格式。對於object對象類同。

print_r(array('a','b',array('aa','bb','cc'))) ;

輸出: Array ( [0] => a [1] => b [2] => Array ( [0] => aa [1] => bb [2] => cc ) );

printf函數 和 stringf

  • %% – 返回百分比符號
  • %b – 二進制數
  • %c – 依照 ASCII 值的字符
  • %d – 帶符號十進制數
  • %e – 可續計數法(好比 1.5e+3)
  • %u – 無符號十進制數
  • %f – 浮點數(local settings aware)
  • %F – 浮點數(not local settings aware)
  • %o – 八進制數
  • %s – 字符串
  • %x – 十六進制數(小寫字母)
  • %X – 十六進制數(大寫字母)

C語言形式的格式化輸出

var_dump 和 var_export

echo var_export(array('a','b',array('aa','bb','cc'))) ;
echo '</br>';
var_dump(array('a','b',array('aa','bb','cc'))) ;

輸出

array ( 0 => 'a', 1 => 'b', 2 => array ( 0 => 'aa', 1 => 'bb', 2 => 'cc', ), )
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> array(3) { [0]=> string(2) "aa" [1]=> string(2) "bb" [2]=> string(2) "cc" } }

var_dump 是輸出調試信息;

var_export 輸出 代碼形式的信息,這種代碼能夠直接拷貝使用,就是原生代碼

複合類型

array(數組)

注意!!!! PHP中的數組是值拷貝,默認狀況下是數組總體拷貝,和其餘語言有很大不一樣

PHP 中的數組是 k,v 類型; 若是沒有指定 key 則從 0 開始排列;

$arr = array('a','b','c');
var_export($arr); // array ( 0 => 'a', 1 => 'b', 2 => 'c', )

也可使用短語法來定義 array

// 自 PHP 5.4 起
$arr = [
        'a',
        'b',
        'c'
    ];

var_export($arr); // array ( 0 => 'a', 1 => 'b', 2 => 'c', )

也能夠直接使用數組,若是數組不存在則自動定義;

$arr['name'] = 'zhangsan';
var_dump($arr);  // 自動建立一個 數組,而且 填入 name = zhangsan

$arr2['stu']['name'] = 'zhangsan';
$arr2['stu']['age'] = '17';
var_dump($arr2); // 自動建立一個二維數組; 而且填入相關信息

可使用 [] 符號,給數組新增 k,v; 至關於 push;

$arr[] = 'zhangsan';
var_dump($arr);  //  給數組新增一個k,v;

$arr2[]['name'] = 'zhangsan';
$arr2[]['age'] = '17';
var_dump($arr2);  // 二維數組

key 能夠是 integer 或 string ; 若是 key 已存在,則會覆蓋;

此外 key 會有以下的強制轉換:

  • 包含有合法整型值的字符串會被轉換爲整型。例如鍵名 "8" 實際會被儲存爲 8。可是 "08" 則不會強制轉換,由於其不是一個合法的十進制數值。
  • 浮點數也會被轉換爲整型,意味着其小數部分會被捨去。例如鍵名 8.7 實際會被儲存爲 8。
  • 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存爲 1 而鍵名 false 會被儲存爲 0。
  • Null 會被轉換爲空字符串,即鍵名 null 實際會被儲存爲 ""。
  • 若是在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,以前的都被覆蓋了。
$array = array(
    1    => "a",
    "1"  => "b",  // 會被轉換成 1=> 'b'
    1.5  => "c",  //  會被轉換成 1=> 'c' 
    true => "d", //  會被轉換成 1=> 'd'
);
var_dump($array); // 輸出 1 => 'd';

PHP 數組的key,能夠支持 自增 key 和 自定義 key 混合使用;

自增key 規則: 若數組中已存在 數字key ,在最大的 數字key 且要>=0 的基礎上 +1 ,若是沒有則從0開始;

$arr=[
       -9=>'-9', // 數字key, 但它小於0
       -2, // 0=>-2,按照規則找數組中最大的 數字key  (>=0) ,並無,因此從0 開始;
       'zhangsan',  // 沒有key,因此在最大key的基礎上+1,則是 : 1 => zhangsan
       3=> '0',
       2=>'-1',
       'ermazi' // 4=>ermazi
    ];

   var_export($arr);
   // 輸出 array ( -9 => '-9', 0 => -2, 1 => 'zhangsan', 3 => '0', 2 => '-1', 4 => 'ermazi', ) 
   
   $arr[] = 'lisi';  // 至關於 push  , 5=>lish
   var_export($arr);

數組實用函數

count() 能夠來得到數組的數量;

list($a,$b,$c) 能夠將數組拆分紅變量;

$info = array('coffee', 'brown', 'caffeine');

// 列出全部變量
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\n";

// 列出他們的其中一個
list($drink, , $power) = $info;
echo "$drink has $power.\n";

// 或者讓咱們跳到僅第三個
list( , , $power) = $info;
echo "I need $power!\n";

// list() 不能對字符串起做用
list($bar) = "abcde";
var_dump($bar); // NULL

判斷key是否存在

echo array_key_exists(3,$arr);

echo  isset($arr[3]); //  使用這種速度更快

其餘的請見: 數組函數


數組與 循環

// 方式1,KV
foreach ($arr as $item => $value){
   echo  $item . ' - ' .$value;
   echo  '<br/>';
}

echo  '<br/>';

// 方式2,只有V
foreach ($arr as $value){
    echo $value;
    echo  '<br/>';
}

// 循環中改變數組值 (常規方式)
foreach ($arr as $item => $value){
    echo $arr[$item] = 'newvalue';
    echo  '<br/>';
}

// 循環中改變數組值 (引用方式)
foreach ($arr as &$value){  // & 至關於循環把每個數組元素的 引用給 $value ;
    echo $value = 'newvalue2'; // 經過引用改變值
    echo  '<br/>';
}
var_export($arr);

刪除數組元素

unset($arr[0]);  // 清理數組某個元素
unset($arr); // 清理整個數組

多維數組

$fruits = array ( "fruits"  => array ( "a" => "orange",
                                       "b" => "banana",
                                       "c" => "apple"
                                     ),
                  "numbers" => array ( 1,
                                       2,
                                       3,
                                       4,
                                       5,
                                       6
                                     ),
                  "holes"   => array (      "first",
                                       5 => "second",
                                            "third"
                                     )
                );

// Some examples to address values in the array above 
echo $fruits["holes"][5];    // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]);  // remove "first"

// Create a new multi-dimensional array
$juices["apple"]["green"] = "good";

數組的比較

能夠用 array_diff()和數組運算符來比較數組。

$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);

$a += $b; // Union of $a += $b is $a and $b
echo "Union of \$a += \$b: \n";
var_dump($a);

輸出

Union of $a and $b:
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}
Union of $b and $a:
array(3) {
  ["a"]=>
  string(4) "pear"
  ["b"]=>
  string(10) "strawberry"
  ["c"]=>
  string(6) "cherry"
}
Union of $a += $b:
array(3) {
  'a' =>
  string(5) "apple"
  'b' =>
  string(6) "banana"
  'c' =>
  string(6) "cherry"
}

注意!!!! PHP中的數組是值拷貝,默認狀況下是數組總體拷貝,和其餘語言有很大不一樣

object(對象)

PHP 支持面向對象,也就是說能夠自定義 class;

callable(可調用)

特殊類型

resource(資源)

資源 resource 是一種特殊變量,保存了到外部資源的一個引用(ID)。資源是經過專門的函數來創建和使用的。如打開文件、打開數據庫等函數,反回的就是資源類型; 從其餘類型轉換爲資源沒有實際意義;

get_resource_type()
此函數返回一個字符串,用於表示傳遞給它的 resource 的類型。若是參數不是合法的 resource,將產生錯誤。

$c = mysql_connect();
echo get_resource_type($c)."\n";
// 打印:mysql link

$fp = fopen("foo","w");
echo get_resource_type($fp)."\n";
// 打印:file

$doc = new_xmldoc("1.0");
echo get_resource_type($doc->doc)."\n";
// 打印:domxml document

釋放資源
引用計數系統是 Zend 引擎的一部分,能夠自動檢測到一個資源再也不被引用了(和 Java 同樣)。這種狀況下此資源使用的全部外部資源都會被垃圾回收系統釋放。所以,不多須要手工釋放內存。 若是外部資源有 close 等回收函數,仍是須要手動回收一下確保回收資源;

Note: 持久數據庫鏈接比較特殊,它們不會被垃圾回收系統銷燬。須要手動 close; 參見數據庫永久鏈接一章。

NULL(無類型)

特殊的 NULL 值表示一個變量沒有值。NULL 類型惟一可能的值就是 NULL。

在下列狀況下一個變量被認爲是 NULL:

  • 被賦值爲 NULL。
  • 還沒有被賦值。
  • 被 unset()。

文檔類型

文檔類型並非實際的PHP語言類型沒法在代碼中使用, 文檔類型指的是爲了咱們方便讀懂 PHP的文檔所在文檔中使用得一些類型;

mixed
mixed 說明一個參數能夠接受多種不一樣的(但不必定是全部的)類型。

例如 gettype() 能夠接受全部的 PHP 類型,str_replace() 能夠接受字符串和數組。

number
number 說明一個參數能夠是 integer 或者 float。

callback
本文檔中在 PHP 5.4 引入 callable 類型以前使用 了 callback 僞類型。兩者含義徹底相同。

array|object
array|object 意思是參數既能夠是 array 也能夠是 object。

void
void 做爲返回類型意味着函數的返回值是無用的。void 做爲參數列表意味着函數不接受任何參數。

...
在函數原型中,$... 表示等等的意思。當一個函數能夠接受任意個參數時使用此變量名。

image.png

類型轉換

轉BOOL

當轉換爲 boolean 時,如下值被認爲是 FALSE:

  • 布爾值 FALSE 自己
  • 整型值 0(零)
  • 浮點型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的數組
  • 特殊類型 NULL(包括還沒有賦值的變量)
  • 從空標記生成的 SimpleXML 對象
  • 全部其它值都被認爲是 TRUE(包括任何資源 和 NAN)。

Warning
-1 和其它非零值(不論正負)同樣,被認爲是 TRUE!
'\0'不是FALSE;

轉換爲數字(整數和浮點數)

BOOL值,TRUE: 1, FALSE 爲0;

從字符串轉換爲數值:

$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)
轉換爲數組

對於任意 integer,float,string,boolean 和 resource 類型,若是將一個值轉換爲數組,將獲得一個僅有一個元素的數組,其下標爲 0,該元素即爲此標量的值。換句話說,(array)$scalarValue 與 array($scalarValue) 徹底同樣。

若是一個 object 類型轉換爲 array,則結果爲一個 K,V數組,鍵名將爲成員變量名;
不過有幾點例外:私有變量前會加上類名做前綴;保護變量前會加上一個 '*' 作前綴。這些前綴的先後都各有一個 空 字符。這會致使一些不可預知的行爲:

<?php

class A {
    private $A = '1';  // This will become "\0A\0A"
}

class B extends A {
    private $A = '2'; // This will become "\0B\0A"
    public $AA = '3'; // This will become "AA"
    protected $CC = '4'; // This will become "\0*\0CC";
}
$arr = (array) new B() ;
var_dump($arr);

echo  $arr["AA"];  // 輸出3
echo  $arr["\0B\0A"];  // 輸出  2
echo  $arr["\0A\0A"];  // 輸出 1 
echo  $arr["\0*\0CC"];  // 輸出 4
?>

將 NULL 轉換爲 array 會獲得一個空的數組。

\0
\0 在C語言中表示表示一個字符串的結尾符號;可是在PHP裏面就是一個空字符,經過 trim 能夠去掉 開頭和結尾的空字符; 空字符沒有實際意義,輸出的時候也沒法經過觀察字符串內容看到空字符,但它確實是存在的; 在使用得時候要注意一下; (\0 不是NULL,它的 strlen 是1);

轉換爲對象

若是將一個對象轉換成對象,它將不會有任何變化。

若是其它任何類型的值被轉換成對象,將會建立一個內置類 stdClass 的實例。
若是該值爲 NULL,則新的實例爲空。

array 轉換成 object 將使鍵名成爲屬性名並具備相對應的值。

<?php
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // PHP 7.2.0 後輸出 'bool(true)',以前版本會輸出 'bool(false)' 
var_dump(key($obj)); // PHP 7.2.0 後輸出 'string(1) "1"',以前版本輸出  'int(1)' 
?>

對於其餘值,會包含進成員變量名 scalar。

<?php
$obj = (object) 'ciao';
echo $obj->scalar;  // outputs 'ciao'
?>
使用 settype 類型轉換
$foo = "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo 如今是 5   (integer)
settype($bar, "string");  // $bar 如今是 "1" (string)

引用

相關文章
相關標籤/搜索