<?php $4site = 'not yet'; // 非法變量名;以數字開頭 $_4site = '_4site'; // 合法變量名;如下劃線開頭 $i站點is = 'mansikka'; // 合法變量名;能夠用中文 ?>
<?php $foo = 'Bob'; // 將 'Bob' 賦給 $foo $bar = &$foo; // 經過 $bar 引用 $foo $bar = "My name is $bar"; // 修改 $bar 變量 echo $bar;//My name is Bob echo $foo;//My name is Bob // $foo 的值也被修改 ?>
如下結果在命令行中有效,網頁php中請不要嘗試。。。都是坑。
Example #1 使用 global或$GLOBALSphp
<?php $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; } Sum(); echo $b;//3 ?>
如下爲網頁php文件中測試結果html
<?php $var=999; function test(){ global $var; unset($var); } test(); var_dump($GLOBALS['var']); //null var_dump($var); //999 $var1=999; function test(){ global $var1; unset($GLOBALS['var1']); } test(); var_dump($GLOBALS['var1']); //PHP Notice:Undefined index: var1 var_dump($var1); //999 ?>
僅在局部函數域中存在,但當程序執行離開此做用域時,其值並不丟失。
若是在聲明中用表達式的結果對其賦值會致使解析錯誤。
Example #5 使用靜態變量的例子git
<?php function test() { //static $int = 1+2; // wrong (as it is an expression) //static $int = sqrt(121); // wrong (as it is an expression too) static $a = 0; echo $a; $a++; } ?>
<?php class foo { var $bar = 'I am bar.'; var $arr = array('I am A.', 'I am B.', 'I am C.'); var $r = 'I am r.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo $foo->$bar . "\n";//I am bar. echo $foo->$baz[1] . "\n";//I am bar. $start = 'b'; $end = 'ar'; echo $foo->{$start . $end} . "\n";//I am bar. $arr = 'arr'; echo $foo->$arr[1] . "\n";// I am r. echo $foo->{$arr}[1] . "\n";//I am B. ?> Warning
注意,在 PHP 的函數和類的方法中,超全局變量
不能用做可變變量。$this
變量也是一個特殊變量,不能被動態引用。
define()
函數來定義常量,在 PHP 5.3.0 之後,能夠使用 const
關鍵字在類定義以外定義常量。一個常量一旦被定義,就不能再改變或者取消定義。shell
常量只能包含標量數據(boolean,integer,float 和 string
)。express
<?php define("CONSTANT", "Hello world."); const CONSTANT = 'Hello World'; ?>
Note: 和使用 define() 來定義常量相反的是,使用 const 關鍵字定義常量必須 處於最頂端的做用區域,由於用此方法是在編譯時定義的。這就意味着不能在函數內,循環內以及 if 語句以內用 const 來定義常量。
與變量不一樣,常量不存在可變常量,若是常量名是動態的,也能夠用函數 constant()
來獲取常量的值。用 get_defined_constants()
能夠得到全部已定義的常量列表。數組
例子 | 名稱 | 結果 |
---|---|---|
-$a |
取反 | $a 的負值。 |
$a + $b |
加法 | $a 和 $b 的和。 |
$a - $b |
減法 | $a 和 $b 的差。 |
$a * $b |
乘法 | $a 和 $b 的積。 |
$a / $b |
除法 | $a 除以 $b 的商。 |
$a % $b |
取模 | $a 除以 $b 的餘數。 |
$a ** $b |
冪 | Introduced in PHP 5.6. |
php中沒有整除,能夠使用
floor($a / $b)
代替。
$b = &$a; // $b 是 $a 的引用 See the Arithmetic Operators page (http://www.php.net/manual/en/language.operators.arithmetic.php) Assignment Same as: $a += $b $a = $a + $b Addition $a -= $b $a = $a - $b Subtraction $a *= $b $a = $a * $b Multiplication $a /= $b $a = $a / $b Division $a %= $b $a = $a % $b Modulus See the String Operators page(http://www.php.net/manual/en/language.operators.string.php) $a .= $b $a = $a . $b Concatenate See the Bitwise Operators page (http://www.php.net/manual/en/language.operators.bitwise.php) $a &= $b $a = $a & $b Bitwise And $a |= $b $a = $a | $b Bitwise Or $a ^= $b $a = $a ^ $b Bitwise Xor $a <<= $b $a = $a << $b Left shift $a >>= $b $a = $a >> $b Right shift
位運算符容許對整型數中指定的位進行求值和操做。app
例子 | 名稱 | 結果 |
---|---|---|
$a & $b |
And(按位與) | 將把 $a 和 $b 中都爲 1 的位設爲 1。 |
$a | $b |
Or(按位或) | 將把 $a 和 $b 中任何一個爲 1 的位設爲 1。 |
$a ^ $b |
Xor(按位異或) | 將把 $a 和 $b 中一個爲 1 另外一個爲 0 的位設爲 1。 |
~ $a |
Not(按位取反) | 將 $a 中爲 0 的位設爲 1,反之亦然。 |
$a << $b |
Shift left(左移) | 將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。 |
$a >> $b |
Shift right(右移) | 將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。 |
php中右移是有符號右移
(算術右移
),沒有 無符號右移( 邏輯右移)。
位運算符建議和二進制整形(如0b100110
)結合使用。
例子 | 名稱 | 結果 |
---|---|---|
$a == $b | 等於 | TRUE,若是類型轉換後 $a 等於 $b。 |
$a === $b | 全等 | TRUE,若是 $a 等於 $b,而且它們的類型也相同。 |
$a != $b | 不等 | TRUE,若是類型轉換後 $a 不等於 $b。 |
$a <> $b | 不等 | TRUE,若是類型轉換後 $a 不等於 $b。 |
$a !== $b | 不全等 | TRUE,若是 $a 不等於 $b,或者它們的類型不一樣。 |
$a < $b | 小與 | TRUE,若是 $a 嚴格小於 $b。 |
$a > $b | 大於 | TRUE,若是 $a 嚴格大於 $b。 |
$a <= $b | 小於等於 | TRUE,若是 $a 小於或者等於 $b。 |
$a >= $b | 大於等於 | TRUE,若是 $a 大於或者等於 $b。 |
$a <=> $b | 太空船運算符(組合比較符) | 當$a小於、等於、大於$b時 分別返回一個小於、等於、大於0的integer 值。 PHP7開始提供。 |
$a ?? $b ?? $c | NULL 合併操做符 | 從左往右第一個存在且不爲 NULL 的操做數。若是都沒有定義且不爲 NULL,則返回 NULL。PHP7開始提供。 |
<?php var_dump(0 == "a"); // 0 == 0 -> true var_dump("1" == "01"); // 1 == 1 -> true var_dump("10" == "1e1"); // 10 == 10 -> true var_dump(100 == "1e2"); // 100 == 100 -> true ?>
比較多種類型函數
運算數 1 類型 | 運算數 2 類型 | 結果 |
---|---|---|
null 或 string |
string |
將 NULL 轉換爲 "",進行數字或詞彙比較 |
bool 或 null |
任何其它類型 |
轉換爲 bool,FALSE < TRUE |
object |
object |
內置類能夠定義本身的比較,不一樣類不能比較,相同類和數組一樣方式比較屬性(PHP 4 中),PHP 5 有其本身的說明 |
string,resource 或 number |
string,resource 或 number |
將字符串和資源轉換成數字,按普通數學比較 |
array |
array |
具備較少成員的數組較小,若是運算數 1 中的鍵不存在於運算數 2 中則數組沒法比較,不然挨個值比較(見下例) |
object |
任何其它類型 |
object 老是更大 |
array |
任何其它類型 |
array 老是更大 |
PHP 支持一個錯誤控制運算符:@
。當將其放置在一個 PHP 表達式以前,該表達式可能產生的任何錯誤信息都被忽略掉。測試
This operator is affectionately known by veteran phpers as the stfu(shut the fuck up) operator。
反引號(``
)。注意這不是單引號!PHP 將嘗試將反引號中的內容做爲 shell 命令來執行,並將其輸出信息返回(即,能夠賦給一個變量而不是簡單地丟棄到標準輸出)。使用反引號運算符「`
」的效果與函數 shell_exec()
相同。ui
<?php $output = `ls -al`; echo "<pre>$output</pre>"; ?>
Note: 與其它某些語言不一樣,反引號 不能在雙引號字符串中使用。
PHP 支持 C 風格的前/後遞增與遞減運算符。
Note: 遞增/遞減運算符不影響布爾值。遞減 NULL 值也沒有效果,可是遞增 NULL 的結果是 1。
例子 | 名稱 | 效果 |
---|---|---|
++$a | 前加 | $a 的值加一,而後返回 $a。 |
$a++ | 後加 | 返回 $a,而後將 $a 的值加一。 |
--$a | 前減 | $a 的值減一, 而後返回 $a。 |
$a-- | 後減 | 返回 $a,而後將 $a 的值減一。 |
字符遞增:PHP 沿襲了 Perl 的習慣,而非 C 的。例如,在 Perl 中$a = 'Z'; $a++; 將把 $a 變成'AA'
,而在 C 中,a = 'Z'; a++; 將把 a 變成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。注意字符變量只能遞增,不能遞減
,而且只支持純字母(a-z 和 A-Z)
。遞增/遞減其餘字符變量則無效,原字符串沒有變化。
<?php echo '== Alphabets ==' . PHP_EOL; $s = 'W'; for ($n=0; $n<6; $n++) { echo ++$s . PHP_EOL; } // Digit characters behave differently echo '== Digits ==' . PHP_EOL; $d = 'A8'; for ($n=0; $n<6; $n++) { echo ++$d . PHP_EOL; } $d = 'A08'; for ($n=0; $n<6; $n++) { echo ++$d . PHP_EOL; } ?>
以上輸出:
== Alphabets == X Y Z AA AB AC == Digits == A9 B0 B1 B2 B3 B4 A09 A10 A11 A12 A13 A14
注意'E'這個字符:
$a="9D9"; var_dump(++$a); => string(3) "9E0" but counting onwards from there $a="9E0"; var_dump(++$a); => float(10)
例子 | 名稱 | 效果 |
---|---|---|
$a and $b |
And(邏輯與) | TRUE,若是 $a 和 $b 都爲 TRUE。 |
$a or $b |
Or(邏輯或) | TRUE,若是 $a 或 $b 任一爲 TRUE。 |
$a xor $b |
Xor(邏輯異或) | TRUE,若是 $a 或 $b 任一爲 TRUE,但不一樣時是。 |
! $a |
Not(邏輯非) | TRUE,若是 $a 不爲 TRUE。 |
$a && $b |
And(邏輯與)短路 | TRUE,若是 $a 和 $b 都爲 TRUE。 |
$a || $b |
Or(邏輯或)短路 | TRUE,若是 $a 或 $b 任一爲 TRUE。 |
<?php $a = 0 || 'avacado'; print "A: $a\n"; will print: A: 1 in PHP -- as opposed to printing "A: avacado" as it would in a language like Perl or JavaScript. This means you can't use the '||' operator to set a default value: $a = $fruit || 'apple'; instead, you have to use the '?:' operator: $a = ($fruit ? $fruit : 'apple');//$a = $fruit ?: 'apple' ?>
.
<php $var = 3; echo "Result: " . $var + 3;//3 ?>
The above will print out "3" instead of "Result: 6", since first the string "Result3" is created and this is then added to 3 yielding 3, non-empty non-numeric strings being converted to 0.
例子 | 名稱 | 效果 |
---|---|---|
$a + $b |
聯合 | $a 和 $b 的聯合。 |
$a == $b |
相等 | 若是 $a 和 $b 具備相同的鍵/值對則爲 TRUE。 |
$a === $b |
全等 | 若是 $a 和 $b 具備相同的鍵/值對而且順序和類型都相同則爲 TRUE。 |
$a != $b |
不等 | 若是 $a 不等於 $b 則爲 TRUE。 |
$a <> $b |
不等 | 若是 $a 不等於 $b 則爲 TRUE。 |
$a !== $b |
不全等 | 若是 $a 不全等於 $b 則爲 TRUE。 |
+
運算符把右邊的數組元素附加到左邊的數組後面,兩個數組中
都有的鍵名,則只用左邊數組中的,右邊的被忽略。
Example #1 比較數組
<?php $a = array("apple", "banana"); $b = array(1 => "banana", "0" => "apple"); var_dump($a == $b); // bool(true) var_dump($a === $b); // bool(false) ?>
Example #2 合併數組(+慎用)
<?php $a = array('one','two'); $b=array('three','four','five'); //not a union of arrays' values echo '$a + $b : '; print_r ($a + $b); //a union of arrays' values echo "array_unique(array_merge($a,$b)):"; // cribbed from http://oreilly.com/catalog/progphp/chapter/ch05.html print_r (array_unique(array_merge($a,$b))); ?> //output $a + $b : Array ( [0] => one [1] => two [2] => five ) array_unique(array_merge(Array,Array)):Array ( [0] => one [1] => two [2] => three [3] => four [4] => five )
instanceof
:
1.肯定一個 PHP 變量是否屬於某一類 class 的實例。
2.肯定一個變量是否是繼承自某一父類的子類的實例。
3.肯定一個變量是否是實現了某個接口的對象的實例。
雖然 instanceof 一般直接與類名一塊兒使用,但也能夠使用對象或字符串變量。
Example #5 對其它變量使用 instanceof
<?php interface MyInterface {} class MyClass implements MyInterface {} $a = new MyClass; $b = new MyClass; $c = 'MyClass'; $d = 'NotMyClass'; var_dump($a instanceof $b); // bool(true) var_dump($a instanceof $c); // bool(true) var_dump($a instanceof $d); // bool(false) ?>
若是被檢測的變量不是對象,instanceof 並不發出任何錯誤信息而是返回 FALSE。不容許用來檢測常量。
Example #6 用 instanceof 檢測其它變量
<?php $a = 1; $b = NULL; $c = imagecreate(5, 5);//$c is a resource var_dump($a instanceof stdClass); // bool(false) var_dump($b instanceof stdClass); // bool(false) var_dump($c instanceof stdClass); // bool(false) var_dump(FALSE instanceof stdClass);// PHP Fatal error: instanceof expects an object instance, constant given ?>
結合方向 | 運算符 | 附加信息 |
---|---|---|
無 | clone new |
clone 和 new |
左 | [ |
array() |
右 | ** |
算術運算符 |
右 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ |
類型和遞增/遞減 |
無 | instanceof |
類型 |
右 | ! |
邏輯運算符 |
左 | * / % |
算術運算符 |
左 | + - . |
算術運算符和字符串運算符 |
左 | << >> |
位運算符 |
無 | < <= > >= |
比較運算符 |
無 | == != === !== <> <=> |
比較運算符 |
左 | & |
位運算符和引用 |
左 | ^ |
位運算符 |
左 | | |
位運算符 |
左 | && |
邏輯運算符 |
左 | || |
邏輯運算符 |
左 | ?? |
比較運算符 |
左 | ? : |
ternary |
right | = += -= *= **= /= .= %= &= |= ^= <<= >>= |
賦值運算符 |
左 | and |
邏輯運算符 |
左 | xor |
邏輯運算符 |
左 | or |
邏輯運算符 |
<?php $a = 1; echo $a + $a++; // 3 $i = 1; $array[$i] = $i++; var_dump($array)//[2 => 1] ?>
and/or優先級特別低:
<?php $bool = true && false; var_dump($bool); // false, that's expected $bool = true and false; var_dump($bool); // true, ouch! ?> Because 'and/or' have lower priority than '=' but '||/&&' have higher.