1、简介
PHP 中的变量用一个美圆符号后面跟变量名来表示。变量名是区分大小写的。变量名与 PHP 中其它的标签同样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。 php
注意:在此所说的字母是 a-z,A-Z,以及 ASCII 字符从 127 到 255(0x7f-0xff)。 $this 是一个特殊的变量,它不能被赋值。能够看出变量名中也不能有.号。 html
前面几课其实已经用到了变量,变量的赋值等内容。试试下面的代码吧 数组
4 |
echo "$var, $Var"; // 输出 "Bob, Joe" |
5 |
$3value = 'value'; // 非法变量名;以数字开头运行时将报错 |
6 |
$_3v = 'value'; // 合法变量名;如下划线开头 |
7 |
$i好的is = 'value'; // 合法变量名;能够用中文 |
PHP 也提供了另一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(相似于 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。 安全
使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。例如,下列代码片段将输出“My name is Bob”两次: 服务器
2 |
$foo = 'Bob'; // 将 'Bob' 赋给 $foo |
3 |
$bar = &$foo; // 经过 $bar 引用 $foo |
4 |
$bar = "My name is $bar"; // 修改 $bar 变量 |
6 |
echo $foo; // $foo 的值也被修改 |
虽然在 PHP 中并不须要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具备其类型的默认值 – 布尔类型的变量默认值是 FALSE,整形和浮点型变量默认值是零,字符串型变量默认值是空字符串或者数组变量的默认值是空数组。 函数
依赖未初始化变量的默认值在某些状况下会有问题,例如把一个文件包含到另外一个之中时碰上相同的变量名。另外把 register_globals(全局变量) 打开是一个主要的安全隐患。使用未初始化的变量会发出E_NOTICE错误,可是在向一个未初始化的数组附加单元时不会。isset() 语言结构能够用来检测一个变量是否已被初始化。 性能
2、预约义变量
预约义变量其实就是至关于一些可预见的变量,好比地址?后面的值可使用$_GET获得,这个就是一个典型的预约义变量。 测试
一、$GLOBALS — 引用全局做用域中可用的所有变量。一个包含了所有变量的全局组合数组。变量的名字就是数组的键。(可是我以为这个全局变量容易让代码难以理解,因此我我的不推荐你们这么用)试试下面的代码吧 ui
二、$_SERVER — 服务器和执行环境信息 ,$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器建立,可能根据不一样的服务器给出的内容不同。在 $_SERVER 中,你也许可以,也许不可以找到下面的这些元素。注意,若是以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。 this
key |
简介 |
PHP_SELF |
当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将获得 /test.php/foo.bar。 |
argv |
传递给该脚本的参数的数组。当脚本以命令行方式运行时,argv 变量传递给程序 C 语言样式的命令行参数。当经过 GET 方式调用时,该变量包含query string。 |
argc |
包含命令行模式下传递给该脚本的参数的数目(若是运行在命令行模式下)。 |
GATEWAY_INTERFACE |
服务器使用的 CGI 规范的版本;例如,“CGI/1.1”。 |
SERVER_ADDR |
当前运行脚本所在的服务器的 IP 地址。 |
SERVER_NAME |
当前运行脚本所在的服务器的主机名。若是脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。 |
SERVER_SOFTWARE |
服务器标识字符串,在响应请求时的头信息中给出。 |
SERVER_PROTOCOL |
请求页面时通讯协议的名称和版本。例如,“HTTP/1.0”。 |
REQUEST_METHOD |
访问页面使用的请求方法;例如,“GET”, “HEAD”,“POST”,“PUT”。 |
REQUEST_TIME |
请求开始时的时间戳。从 PHP 5.1.0 起可用。 |
QUERY_STRING |
query string(查询字符串),若是有的话,经过它进行页面访问。 |
DOCUMENT_ROOT |
当前运行脚本所在的文档根目录。在服务器配置文件中定义。 |
HTTP_ACCEPT |
当前请求头中 Accept: 项的内容,若是存在的话。 |
HTTP_ACCEPT_CHARSET |
当前请求头中 Accept-Charset: 项的内容,若是存在的话。例如:“iso-8859-1,*,utf-8”。 |
HTTP_ACCEPT_ENCODING |
当前请求头中 Accept-Encoding: 项的内容,若是存在的话。例如:“gzip”。 |
HTTP_ACCEPT_LANGUAGE |
当前请求头中 Accept-Language: 项的内容,若是存在的话。例如:“en”。 |
HTTP_CONNECTION |
当前请求头中 Connection: 项的内容,若是存在的话。例如:“Keep-Alive”。 |
HTTP_HOST |
当前请求头中 Host: 项的内容,若是存在的话。 |
HTTP_REFERER |
引导用户代理到当前页的前一页的地址(若是存在)。由 user agent 设置决定。并非全部的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。 |
HTTP_USER_AGENT |
当前请求头中 User-Agent: 项的内容,若是存在的话。该字符串代表了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。除此以外,你能够经过get_browser() 来使用该值,从而定制页面输出以便适应用户代理的性能。 |
HTTPS |
若是脚本是经过 HTTPS 协议被访问,则被设为一个非空的值。 |
REMOTE_ADDR |
浏览当前页面的用户的 IP 地址。 |
REMOTE_HOST |
浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。 |
REMOTE_PORT |
用户机器上链接到 Web 服务器所使用的端口号。 |
SCRIPT_FILENAME |
当前执行脚本的绝对路径。若是在命令行界面(Command Line Interface, CLI)使用相对路径执行脚本,例如 file.php 或 ../file.php,那么 $_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。 |
SERVER_ADMIN |
该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。若是脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。 |
SERVER_PORT |
Web 服务器使用的端口。默认值为 “80”。若是使用 SSL 安全链接,则这个值为用户设置的 HTTP 端口。 |
SERVER_SIGNATURE |
包含了服务器版本和虚拟主机名的字符串。 |
PATH_TRANSLATED |
当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 |
SCRIPT_NAME |
包含当前脚本的路径。这在页面须要指向本身时很是有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。 |
REQUEST_URI |
URI 用来指定要访问的页面。例如 “/index.html”。 |
PHP_AUTH_DIGEST |
看成为 Apache 模块运行时,进行 HTTP Digest 认证的过程当中,此变量被设置成客户端发送的“Authorization” HTTP 头内容(以便做进一步的认证操做)。 |
PHP_AUTH_USER |
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,而且正在使用 HTTP 认证功能,这个变量即是用户输入的用户名。 |
PHP_AUTH_PW |
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,而且正在使用 HTTP 认证功能,这个变量即是用户输入的密码。 |
AUTH_TYPE |
当 PHP 运行在 Apache 模块方式下,而且正在使用 HTTP 认证功能,这个变量即是认证的类型。 |
PATH_INFO |
包含由客户端提供的、跟在真实脚本名称以后而且在查询语句(query string)以前的路径信息,若是存在的话。例如,若是当前脚本是经过 URLhttp://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff。 |
ORIG_PATH_INFO |
在被 PHP 处理以前,“PATH_INFO” 的原始版本。 |
三、$_GET 经过 URL 参数传递给当前脚本的变量的数组。即在命令行下失效。咱们在测试php那节讲过$_GET['__DEBUG__'],用法很简单。
四、$_POST 经过 HTTP POST 方法传递给当前脚本的变量的数组。和$_GET方法相似,只是传递方式不一样。
五、$_FILES 经过 HTTP POST 方式上传到当前脚本的项目的数组。
六、$_REQUEST 默认状况下包含了 $_GET,$_POST和 $_COOKIE 的数组。以命令行方式运行时,将不包含 argv 和 argc 信息;它们将存在于 $_SERVER 数组。因为 $_REQUEST 中的变量经过 GET,POST 和 COOKIE 输入机制传递给脚本文件,所以能够被远程用户篡改而并不可信。这个数组的项目及其顺序依赖于 PHP 的 variables_order 指令的配置。
七、$_SESSION 当前脚本可用 SESSION 变量的数组。
八、$_ENV经过环境方式传递给当前脚本的变量的数组。
这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。不少是由支持 PHP 运行的 Shell 提供的,而且不一样的系统极可能运行着不一样种类的 Shell,因此不可能有一份肯定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。
其余环境变量包含了 CGI 变量,而无论 PHP 是以服务器模块仍是 CGI 处理器的方式运行。
九、$_COOKIE经过 HTTP Cookies 方式传递给当前脚本的变量的数组。
十、$php_errormsg$php_errormsg 变量包含由 PHP 生成的最新错误信息。这个变量只在错误发生的做用域内可用,而且要求 track_errors配置项是开启的(默认是关闭的)。
十一、$HTTP_RAW_POST_DATA $HTTP_RAW_POST_DATA 包含 POST 提交的原始数据。
十二、$http_response_header — HTTP 响应头
1三、$argc — 传递给脚本的参数数目
1四、$argv — 传递给脚本的参数数组
3、变量范围
变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度一样包含了 include 和 require 引入的文件。例如:
这个a在b.php一样有效。任何用于函数内部的变量按缺省状况将被限制在局部函数范围内。可是可使用global来改变有效范围。(和$GLOBALS相似,我也不推荐使用)例如:
06 |
global $a;//我声明和外面的a是同样的 |
变量范围的另外一个重要特性是静态变量。静态变量仅在局部函数域中存在,但当程序执行离开此做用域时,其值并不丢失。看看下面的例子:
若是在声明中用表达式的结果对其赋值会致使解析错误。
4、可变变量
其实可变变量就是变量名是个变量而已。请看代码
这段代码,一开始定义了一个变量$a,而后定义了一个变量$$a,其实能够理解为$hello;因此第三句和第四句都将打印出hello world;
注意:要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1]时,解析器须要知道是想要 $a[1]做为一个变量呢,仍是想要 $$a做为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种状况用 ${$a[1]},对第二种状况用 ${$a}[1]。
本文固定连接: http://www.qaforcode.net/archives/219 | 猪哥每日一贴