×
新网 > 虚机资讯 > 正文

php变量

一、简介 PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。 注意:在此所说的字母是 a-z,A-Z,以及 ASCII 字符从 127 到 255(0x7f-0xff)。  $this 是一个特殊的变量,它不能被赋值。可以看出变量名中也

一、简介

PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。

1 (25).jpg

注意:在此所说的字母是 a-z,A-Z,以及 ASCII 字符从 127 到 255(0x7f-0xff)。 $this是一个特殊的变量,它不能被赋值。可以看出变量名中也不能有.号。

前面几课其实已经用到了变量,变量的赋值等内容。试试下面的代码吧

1 <?php
2 $var =\'Bob\';
3 $Var =\'Joe\';
4 echo"$var, $Var"; // 输出"Bob, Joe"
5 $3value =\'value\'; // 非法变量名;以数字开头运行时将报错
6 $_3v =\'value\'; // 合法变量名;以下划线开头
7 $i好的is =\'value\'; // 合法变量名;可以用中文
8
9 ?>

PHP 也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(类似于 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。

使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。例如,下列代码片断将输出“My name is Bob”两次:

1 <?php
2 $foo =\'Bob\'; // 将\'Bob\'赋给 $foo
3 $bar = &$foo; // 通过 $bar 引用 $foo
4 $bar ="My name is $bar"; // 修改 $bar 变量
5 echo$bar;
6 echo$foo; // $foo 的值也被修改
7 ?>

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

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

二、预定义变量

预定义变量其实就是相当于一些可预见的变量,比如地址?后面的值可以使用$_GET得到,这个就是一个典型的预定义变量。

1、$GLOBALS — 引用全局作用域中可用的全部变量。一个包含了全部变量的全局组合数组。变量的名字就是数组的键。(但是我觉得这个全局变量容易让代码难以理解,所以我个人不推荐大家这么用)试试下面的代码吧

1 functiontest(){
2 $l="我在函数里面n";
3 echo$l;
4 echo$GLOBALS[\'l\'];
5
6 }
7 $l="我在函数外面";
8 echo$l."n";
9 test();

2、$_SERVER — 服务器和执行环境信息 ,$_SERVER是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建,可能根据不同的服务器给出的内容不一样。在$_SERVER中,你也许能够,也许不能够找到下面的这些元素。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。

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” 的原始版本。

3、$_GET通过 URL 参数传递给当前脚本的变量的数组。即在命令行下失效。我们在测试php那节讲过$_GET[\'__DEBUG__\'],用法很简单。

4、$_POST通过 HTTP POST 方法传递给当前脚本的变量的数组。和$_GET方法类似,只是传递方式不同。

5、$_FILES通过 HTTP POST 方式上传到当前脚本的项目的数组。

6、$_REQUEST默认情况下包含了$_GET,$_POST和$_COOKIE的数组。以命令行方式运行时,将包含argv和argc信息;它们将存在于$_SERVER数组。由于$_REQUEST中的变量通过 GET,POST 和 COOKIE 输入机制传递给脚本文件,因此可以被远程用户篡改而并不可信。这个数组的项目及其顺序依赖于 PHP 的variables_order指令的配置。

7、$_SESSION当前脚本可用 SESSION 变量的数组。

8、$_ENV通过环境方式传递给当前脚本的变量的数组。

这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。

其他环境变量包含了 CGI 变量,而不管 PHP 是以服务器模块还是 CGI 处理器的方式运行。

9、$_COOKIE通过 HTTP Cookies 方式传递给当前脚本的变量的数组。

10、$php_errormsg$php_errormsg变量包含由 PHP 生成的最新错误信息。这个变量只在错误发生的作用域内可用,并且要求 track_errors配置项是开启的(默认是关闭的)。

11、$HTTP_RAW_POST_DATA$HTTP_RAW_POST_DATA包含 POST 提交的原始数据。

12、$http_response_header — HTTP 响应头

13、$argc — 传递给脚本的参数数目

14、$argv — 传递给脚本的参数数组

三、变量范围

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

1 <?php
2 $a="我是a";
3 include("b.php");
4 ?>

这个a在b.php同样有效。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。但是可以使用global来改变有效范围。(和$GLOBALS类似,我也不推荐使用)例如:

01 <?php
02 $a=\'我在外部\';
03 functiontest(){
04 $a=\'我在内部,我和外面的a无关\';
05 echo$a."n";
06 global$a;//我声明和外面的a是一样的
07 echo$a."n";
08 }
09 echo$a;
10 test();
11 ?>

变量范围的另一个重要特性是静态变量。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:

1 functiontest()
2 {
3 static$a= 0;
4 echo$a."n";
5 $a++;
6 }
7 test();test();

如果在声明中用表达式的结果对其赋值会导致解析错误。

四、可变变量

 

其实可变变量就是变量名是个变量而已。请看代码

1 <?php
2 $a=\'hello\';
3 $$a="world";
4 echo"$a ${$a}";
5 echo"$a $hello";
6 ?>

这段代码,一开始定义了一个变量$a,然后定义了一个变量$$a,其实可以理解为$hello;所以第三句和第四句都将打印出hello world;

注意:要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下$$a[1]时,解析器需要知道是想要$a[1]作为一个变量呢,还是想要$$a作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用${$a[1]},对第二种情况用${$a}[1]。

 

本文固定链接:http://www.qaforcode.net/archives/219 | 猪哥每日一贴

  • 相关专题

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading