变量
基本
<?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或$GLOBALS
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;//3
?>
以下为网页php文件中测试结果
<?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 使用静态变量的例子
<?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
关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。
常量只能包含标量数据(boolean,integer,float 和 string
)。
<?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
位运算符
位运算符允许对整型数中指定的位进行求值和操作。
例子 | 名称 | 结果 |
---|---|---|
$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()
相同。
<?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.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。