php易錯筆記-變量,常量,運算符

變量

基本

<?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 的值也被修改
?>

global 關鍵字

如下結果在命令行中有效,網頁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。

執行運算符(shell命令)

反引號(``)。注意這不是單引號!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)

邏輯運算符(and,or,xor)

例子 名稱 效果
$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.
相關文章
相關標籤/搜索