本章说说变量的定义。
如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到:- 如何定义变量,它和C# 等语言有什么不同呢?
- 变量区分大小写吗?
- PHP的变量还有其他重要的吗?
- 常量和变量的定义一样吗?
<?php $var = ' Jim ' ; $VAR = ' Kimi; echo "$var,$VAR";//输出“Jim,Kimi" ?>
你可能还关心变量的命名,其实和大多数语言一样。 2. 变量区分大小写吗? 如 1里说的,区分大小写。 注意,需要说明的一点是自PHP4以来,引入了引用赋值的概念,其实和多数语言的引用类似,不过我觉得最类似的是C/C++.因为它也用到了"&"符号。例如: 1 <? php 2 $foo = ' Bob ' ; // 赋值'Bob'给foo 3 $bar = & $foo ; // 通过$bar引用.注意&符号 4 $bar = " My name is $bar " ; // 修改 $bar 5 echo $bar ; 6 echo $foo ; // $foo 也修改了. 7 ?>
和其他语言一样,只能对有变量名的变量才可以引用。 3. PHP其他重要点预定义变量 预定义变量在PHP是一个重要的概念。 PHP 提供了大量的预定义变量。由于许多这些变量依赖于运行的服务器的版本和设置,及其它因素,所以并没有详细的说明文档。一些预定义变量在 PHP 以命令行形式运行时并不生效。 需要注意的是 在PHP 4.2.0 以及后续版本中,PHP 指令 register_globals 的默认值为 off。这是 PHP 的一个主要变化。让 register_globals 的值为 off 将影响到预定义变量集在全局范围内的有效性。例如,为了得到 DOCUMENT_ROOT 的值,将必须使用 $_SERVER['DOCUMENT_ROOT'] 代替 $DOCUMENT_ROOT,又如,使用 $_GET['id'] 来代替 $id 从 URL http://www.example.com/test.php?id=3 中获取 id 值,亦或使用 $_ENV['HOME'] 来代替 $HOME 获取环境变量 HOME 的值。 从 PHP 4.1.0 开始,PHP 提供了一套附加的预定数组,这些数组变量包含了来自 web 服务器(如果可用),运行环境,和用户输入的数据。这些数组非常特别,它们在全局范围内自动生效,例如,在任何范围内自动生效。因此通常被称为自动全局变量(autoglobals)或者超全局变量(superglobals)。(PHP 中没有用户自定义超全局变量的机制。)超全局变量罗列于下文中;而且,你也将注意到旧的预定义数组( $HTTP_*_VARS)仍旧存在。自 PHP 5.0.0 起,长格式的 PHP 预定义变量可以通过设置 register_long_arrays 来屏蔽。 下表是PHP的超全局变量: 超全局变量 | 描述 |
$GLOBALS | 包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键名为全局变量的名称。从 PHP 3 开始存在 $GLOBALS 数组。 |
$_SERVER | 变量由 web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 $HTTP_SERVER_VARS 数组(依然有效,但反对使用)。 |
$_GET | 经由 URL 请求提交至脚本的变量。类似于旧数组 $HTTP_GET_VARS 数组(依然有效,但反对使用)。 |
$_POST | 经由 HTTP POST 方法提交至脚本的变量。类似于旧数组 $HTTP_POST_VARS 数组(依然有效,但反对使用)。 |
$_COOKIE | 经由 HTTP Cookies 方法提交至脚本的变量。类似于旧数组 $HTTP_COOKIE_VARS 数组(依然有效,但反对使用)。 |
$_FILES | 经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES 数组(依然有效,但反对使用) |
$_ENV | 执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS 数组(依然有效,但反对使用)。 |
$_REQUEST | 经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。所有包含在该数组中的变量的存在与否以及变量的顺序均按照 php.ini 中的 variables_order 配置指示来定义。此数组在 PHP 4.1.0 之前没有直接对应的版本。参见 import_request_variables()。 |
$_SESSION | 当前注册给脚本会话的变量。类似于旧数组 $HTTP_SESSION_VARS 数组(依然有效,但反对使用) |
1 <? php 2 $var = 0 ; 3 function test( $index ) 4 { 5 $var = $var + 1 ; 6 echo " The " . $index . " number is " . $var . " <br> " ; 7 } 8 test( 1 ); 9 test( 2 ) 10 ?>
你认为以上的代码会显示什么结果呢? 如果你认为是下面: 结果1: The 1 number is 1 The 2 number is 2
不好意思,你的结果是错误的。 其实正确的结果应该是: 结果2 The 1 number is 1 The 2 number is 1
那么你从其中发现了什么呢?我们可以知道虽然第2行的代码定义在外面,但第5行的变量和它是不一样的。第5行的变量仅在这个函数里使用。进一步的,如果我想调用第一行的变量而显示结果2.代码可以如下: 1 <? php 2 $var = 0 ; 3 function test( $index ) 4 { 5 global $var ; 6 $var = $var + 1 ; 7 echo " The " . $index . " number is " . $var . " <br> " ; 8 } 9 test( 1 ); 10 test( 2 ) 11 ?>
这个代码段和上面的代码段有何区别呢?注意第5行,多了一个 global关键字。明白了吧。 那么还有没有其他方法呢?答案是肯定的。 代码如下: 1 <? php 2 $var = 0 ; 3 function test( $index ) 4 { 5 6 $GLOBALS [ " var " ] = $GLOBALS [ " var " ] + 1 ; 7 echo " The " . $index . " number is " . $GLOBALS [ " var " ] . " <br> " ; 8 } 9 test( 1 ); 10 test( 2 ) 11 ?>
代码有什么特殊的吗?那就是用到了 $GLOBALS这个超全局变量。 PHP也有静态变量的说法。不过静态变量一般用在函数里,只能是局部变量了。看看下面代码吧: 1 <? php 2 function Test() 3 { 4 static $a = 0 ; 5 echo $a . " <br> " ; 6 $a ++ ; 7 } 8 Test(); 9 Test(); 10 ?>
结果为 1 2
PHP还有一个相当令人兴奋的特性: 可变变量 所谓可变变量,就是一个变量的变量名可以动态的设置和使用。 看看下面的例子: 1 <? php 2 $a = " hello " ; 3 $hello = " world " ; 4 echo $a . " " . $ $a ; 5 ?>
输出的结果居然是hello,world.太神奇了。$$a其实就是$hello,因为$a的值是hello。 变量就这多了。下面看看常量。 常量 PHP的常量是不是前面加const呢?让我们看一看。 不是的。在PHP必须用下面的方式定义。 bool define ( string name, mixed value [, bool case_insensitive] ) name 为常量名,value为常量的值。case_insensitive]为大小写敏感。默认为敏感。例如: 1 <? php 2 define ( " CONSTANT " , " Hello world. " ); 3 echo CONSTANT ; // outputs "Hello world." 4 echo Constant ; // outputs "Constant" and issues a notice. 5 6 define ( " GREETING " , " Hello you. " , true ); 7 echo GREETING; // outputs "Hello you." 8 echo Greeting; // outputs "Hello you." 9 10 ?>
常量和变量不同:
-
常量前面没有美元符号($);
-
常量只能用 define() 函数定义,而不能通过赋值语句;
-
常量可以不用理会变量范围的规则而在任何地方定义和访问;
-
常量一旦定义就不能被重新定义或者取消定义;
-
常量的值只能是标量。