<?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.