2

变量

基本

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

Maxiye
648 声望19 粉丝