PHP变量、常量、表达式、控制结构

PHP代码文件以<?php开始以?>结束,在纯PHP的文件中建议省略结束符。每一条PHP语句都必须以分号(;)结束。强烈建议不要将PHP代码和HTML混合在一起,应当将逻辑与视图分离。PHP支持 // /* */ # 风格的注释。

变量必须以$开头。PHP只有变量是区分大小写的,其它的标识符、关键词、类名、常量和函数都是不区分大小的。$this是特殊变量,不能被赋值。

变量赋值都是按值拷贝(value-coping),按值拷贝的类型包括字符串和数组,不包括对象,对象默认是按引用拷贝的。PHP在变量前加&提供按引用赋值(assign by reference)的表达式,引用赋值只能针对具名变量(named variable)。

变量根据所使用的上下文在未初始化时设定一个初始值。在需要整数或浮点数时,默认初始化为0。布尔类型默认为false,字符串默认为空字符串,数组默认为空数组。对象默认初始化为stdClass。使用isset()内建机制可以确定一个变量是否已经初始化了。强烈建议给每个变量进行初始化。unset()释放给定的变量;

变量相关函数列表:
empty 检查一个变量是否为空;
gettype 获取变量的类型;
is_array is_bool is_double is_long…是否为对应类型的变量;
boolval floatval intval strval 进行类型转换;
print_r var_dump var_export 获取变量信息的字符串表示;

PHP的预定义变量都是为Web环境服务的,如:$_SERVER,$_GET,$_POST,$_SESSION,$_ENV,$_COOKIE。当用在命令行环境是有$argc和$argv两个变量。

PHP文件中定义的全局变量(在任何函数、类之外定义的变量)会传递到require和include文件中去。但不会传递到函数中去,函数只能使用自己定义的局部变量。要在函数中访问全局变量得用global声明或者$GLOBALS数组访问。可以在函数内用关键字static定义静态局部变量。不推荐使用可变变量名$$var,会产生难以理解的代码。在PHP中不能创建作用域为循环、条件分支和其它类型的块变量,只能在函数中创建局部变量,也就是说在if分支中创建的变量,在外部依然可以访问。

常量用define方式定义,重复定义只取第一次定义的值,推荐在集中的地方进行常量定义。常量只能包含标量数据。常量具有全局作用域,同时可以在任何地方定义,比如函数内。如果访问不存在的常量,将返回常量的名字字符串。
预定义常量(魔术常量):__LINE____DIR____FILE____FUNCTION__ __CLASS__ __METHOD__ __TRAIT__ __NAMESPACE__

表达式的结合性和优先级只指明表达式如何聚合,没有指明求值顺序。当运算子跟运算符要求的类型不一致时会发生隐式转换。尽可能少的依赖这种隐式转换。这也是为何PHP中需要加号和点号来表示加法和字符串连接的原因。

PHP中只有浮点数除法,仅在两个整数能够整除的情况下返回整数。取模运算则会把浮点数转化为整数(Lua可以对浮点数进行取模),$a % $b 的结果的符号与$a符号一致。

PHP的赋值表达式是有值的,意味着 $a = ($b = 4) + 5; 是正确的。在PHP中为了避免意外的情况,应该总是使用===,来避免字符串向数字的意外转变,如下代码所示,应该避免不同类型之间的比较运算符操作。

<?php
$a = "001";
$b = "01";

var_dump($a == $b);
var_dump($a === $b);

在表达式前放置@符,该表达式产生的任何错误信息将被忽略,并且表达式返回0值。

在PHP中对字母进行++是可以的,但是+1操作将把字母转为0,从而得到1。PHP沿袭了Perl的习惯,$a='Z'; $a++;此时$a变为了’AA’,而不是'[‘,其实质是PHP将字母当做了26进制的数字。字符变量只能递增不能递减,并且只支持字母。

$a = 'Z';
var_dump(++$a);
var_dump($a+1);
$b = '2zzz';
var_dump(++$b);  //=> 3aaa

数组运算:$a+$b 表示数组合并,两个数组中都有的键名只用$a的;$a == $b 比较键值对是否相同;$a===$b比较键值对相同且顺序类型一致;

instanceof 用来检查对象是否是类的实例,类可以是类名或者类名字符串或者类对象。

class MyClass {}

$a = new MyClass;
$b = new MyClass;
$c = "MyClass";

var_dump($a instanceof $a);
var_dump($a instanceof $b);
var_dump($a instanceof $c);  //必须是字符串变量
var_dump($a instanceof MyClass);

流程控制:PHP支持 if、while、do-while、switch、c-for通用的流程控制结构。除此以外还支持foreach语法专门用来遍历数组和对象(意味着不能遍历字符串)。有两种语法:

foreach(array_expression as $value)
    statement
foreach(array_expression as $key => $value)
     statement

每次循环时都会将数组内部的指针向前移动一步,调用reset可以重置数组指针,使得指向头部。要在遍历是修改数组,应该以引用赋值的方式。数组的最后一个元素的$value引用在foreach循环后仍然会保留,建议使用unset()将其销毁。用list()内建机制来接收数组中的值到变量中,list()只能用于数字索引的数组,并假定数字索引从0开始。

$arr = array(1, 2, 3, 4);
foreach($arr as &$value) {
     $value = $value * 2;
}
unset($value);

//可以用each函数循环数组
while (list(, $value) = each($arr)) {
     ehco $value;
}

break和continue可以接受一个可选的数字来决定跳出几重循环。
switch中case表达式的值必须是整数、浮点数以及字符串,不能用数组或对象。如果switch在循环中,continue必须是continue 2才能跳到循环末尾。switch/case中作的松散比较。

return语句:除了用来结束函数的执行外,return也会终止eval()语句或者脚本执行。如果当前脚本是被include或者require的,则控制权交回调用文件。并且return的值作为include的返回值。

include/require语句:当一个文件被包含时,被包含的代码继承了include所在行的变量范围,也即包含文件中该行处任何变量在被包含文件中都可用。并且被包含的文件中的变量也具有include所在行的变量范围。但是被包含文件中定义的函数和类具有全局作用域。每include一次文件,就会执行一次被包含文件的最外层代码,包括函数定义。如果多次include一个文件将会报函数多次定义的错误。include成功返回TRUE,失败返回FALSE,除非被包含文件自己return了值。函数定义不管在return前后在包含文件中都是可用的。
查找路径:如果只指定文件名,则先从include_path指定的目录中查找,找不到将在脚本文件所在目录或者当前工作目录查找,如果还是找不到,将发出警告。如果定义了路径(绝对路径或相对路径),如果是相对路径,解析器将会相对于当前工作目录开始寻找。
require/include的不同:对待失败时include输出警告(E_WARNING)而require产生编译错误(E_COMPILE_ERROR),因为require包含的文件是必须的。
include_once和require_once的行为与相应的非once版本一致,只是在文件可能被多次包含的情况下,确保只被包含一次以避免函数重定义,变量重新赋值等问题。

Leave a Reply

Your email address will not be published. Required fields are marked *