变量

基础

PHP中的变量用一个美元符号后面跟变量名来表示。

变量名区分大小写。

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*,在此所说的字母是a-z,A-Z,以及ASCII字符从127-255(0x7f-0xff)。

$this是一个特殊的变量,它不能被赋值。

只有有名字的变量才可以引用赋值。

虽然在PHP中并不需要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具有其类型的默认值-布尔类型的变量默认值是FALSE,整型和浮点型变量默认值是零,字符串型变量默认值是空字符串以及数组变量的默认值是空数组。

依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个之中碰到相同的变量名。另外把register_globals打开是一个主要的安全隐患。使用未初始化的变量会发出E_NOTICE错误,但是在向一个未初始化的数组附加单元时不会。isset()语言结构可以用来检测一个变量是否已被初始化。

预定义变量

PHP提供了大量的预定义变量。由于许多变量依赖于运行的服务器的版本和设置,及其他因素,所以并没有详细的说明文档。一些预定义变量在PHP以命令行形式运行时并不生效。

WarningPHP4.2.0以及后续版本中,PHP指令register_globals的默认值为off。这是PHP的一个主要变化。让register_globals的值为off将影响到预定义变量集在全局范围内的有效性。

PHP中没有用户自定义超全局变量的机制。

自PHP5.0.0起,用register_long_arrays设置选项可禁用长类型的PHP预定义变量数组。

Note:超级全局变量不能被用作函数或类方法中的可变变量。

Note:尽管超全局变量和HTTP_*_VARS同时存在,但是它们并不是同一个变量,所以改变其中一个的值并不会对另一个产生影响。

如果某些variables_order中的变量没有设定,它们的对应的PHP预定义数组也是空的。

变量范围

变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含了include和require引入的文件。

在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。

PHP的全局变量和C语言有一点点不同,在C语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP中全局变量在函数中使用时必须声明为global。

对于一个函数能够声明的全局变量的最大个数,PHP没有限制。

在全局范围内访问变量的第二个办法,是用特殊的PHP自定义$GLOBALS数组。$GLOBALS是一个超全局变量。

可变变量

一个变量的变量名可以动态的设置和使用。一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。

也可使用花括号来给属性名清晰定界。最有用是在属性位于数组中,或者属性名包含有多个部分或者属性名包含有非法字符时。

Cookie是HTTP信息头中的一部分,因此SetCookie函数必须在向浏览器发送任何输出之前调用。对于header()函数也有同样的限制。

Warning:在PHP的函数和类的方法中,超全局变量不能用作可变变量。$this变量也是一个特殊变量,不能被动态引用。

Note:超全局数组例如$_POST和$_GET,自PHP4.1.0起可用。

Note:变量名中的点和空格被转换成下划线。

Cookies是HTTP信息头中的一部分,因此SetCookie函数必须在向浏览器发送任何输出之前调用。对于header()函数也有同样的限制。

注意在浏览器中一个cookie会替换掉上一个同名的cookie,除非路径或者域不同。

确定变量类型

因为PHP会判断变量类型并在需要时进行转换(通常情况下),因此在某一时刻给定的变量是何种类型并不明显。PHP包括几个函数可以判断变量的类型。例如:gettype(),is_array(),is_float(),is_object()和is_string()。

常量

在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。传统上常量标识符总是大写的。

和superglobals一样,常量的范围是全局的。不用管作用区域就可以在脚本的任何地方访问常量。

可以用define()函数来定义常量,在PHP5.3.0以后,可以使用const关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。

常量只能包含标量数据(boolean,integer,float和string)。可以定义resource常量,但应尽量避免,因为会造成不可预料的结果。

可以简单的通过指定其名字来取得常量的值,与变量不同,不应该在常量前面加上$符号。如果常量名是动态的,也可以用函数constant()来获取常量的值。用get_defined_constants()可以获得所有已定义的常量列表。

Note:常量和(全局)变量在不同的名字空间中。这意味着例如TRUE和$TRUE是不同的。

如果使用了一个未定义的常量,PHP假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT对应“CONSTANT”)。此时将发出一个E_NOTICE级的错误。如果只想检查是否定义了某常量,用defined()函数。

常量和变量有如下不同:

  • 常量前面没有美元符号($);
  • 常量只能用defined()函数定义,而不能通过赋值语句;
  • 常量可以不用理会变量的作用域而在任何地方定义和访问;
  • 常量一旦定义就不能被重新定义或者取消定义;
  • 常量的值只能是标量。

Note:

和使用define()来定义常量相反的是,使用const关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及if语句之内用const来定义常量。

魔术常量

PHP向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

 

posted @ 2018-01-03 11:28  xx_千寻  阅读(201)  评论(0)    收藏  举报