Home  >  Article  >  php教程  >  PHP 常量与变量

PHP 常量与变量

WBOY
WBOYOriginal
2016-06-13 08:59:48872browse

PHP 常量与变量

【常量】
可以用 define() 函数来定义常量,在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。
常量只能包含标量数据(boolean,integer,float 和 string)。可以定义 resource 常量,但应尽量避免,因为会造成不可预料的结果。
可以简单的通过指定其名字来取得常量的值,与变量不同,不应该在常量前面加上 $ 符号。如果常量名是动态的,也可以用函数 constant() 来获取常量的值。用 get_defined_constants() 可以获得所有已定义的常量列表。
如果只想检查是否定义了某常量,用 defined() 函数。
常量和变量有如下不同:
? 常量前面没有美元符号($);
? 常量只能用 define() 函数定义,而不能通过赋值语句;
? 常量可以不用理会变量的作用域而在任何地方定义和访问;
? 常量一旦定义就不能被重新定义或者取消定义;
? 常量的值只能是标量。
预定义常量

很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。这些特殊的常量不区分大小写,如下:

 

名称 说明
__LINE__ 文件中的当前行号。
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__ 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
【变量】
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 的值。
?超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
?$GLOBALS — 引用全局作用域中可用的全部变量
?$_SERVER — 服务器和执行环境信息
?$_GET — HTTP GET 变量
?$_POST — HTTP POST 变量
?$_FILES — HTTP 文件上传变量
?$_REQUEST — HTTP Request 变量
?$_SESSION — Session 变量
?$_ENV — 环境变量
?$_COOKIE — HTTP Cookies
?$php_errormsg — 前一个错误信息
?$HTTP_RAW_POST_DATA — 原生POST数据
?$http_response_header — HTTP 响应头
?$argc — 传递给脚本的参数数目
?$argv — 传递给脚本的参数数组

 

global 关键字
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须声明为 global或者用特殊的 PHP 自定义 $GLOBALS 数组。$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
静态变量
变量范围的另一个重要特性是静态变量(static variable)。
可变变量
有时候使用可变变量名是很方便的。就是说,一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置。
要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。

 

<!--?php
	// 常量,忽略大小写
	define(INVALIDE_VALUE, 12, true);
	echo INVALIDE_VALUE."<br-->";
	echo invalide_value."
";	
	if(defined("INVALIDE_VALUE"))
	{
		echo "INVALIDE_VALUE 已经定义".__LINE__."
";;
	}
	
	// 变量
	$str1 = &#39;str1&#39;;
	$str2 = & $str1;  // 引用	 
	$str1 = "Changed $str1";
	echo $str1."
";
	echo $str2."
";	
	
	echo $_SERVER[&#39;DOCUMENT_ROOT&#39;]."
"; // 预定义变量
	
	$gVal = 13;
	function Test() // 全局变量
	{
		global $gVal;
		echo $gVal."
";
		echo $GLOBALS[&#39;gVal&#39;]."
";
	}
	Test();
	
	function test1()
	{
    	static $a = 0; // 静态变量
    	echo $a;
    	$a++;
	}
	
	// 可变变量
	class foo {
    var $bar = &#39;I am bar.&#39;;
    var $arr = array(&#39;I am A.&#39;, &#39;I am B.&#39;, &#39;I am C.&#39;);
    var $r   = &#39;I am r.&#39;;
	}

	$foo = new foo();
	$bar = &#39;bar&#39;;
	$baz = array(&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;, &#39;quux&#39;);
	echo $foo->$bar ."
";
	echo $foo->$baz[1]  ."
";

	$start = &#39;b&#39;;
	$end   = &#39;ar&#39;;
	echo $foo->{$start . $end}  ."
";

	$arr = &#39;arr&#39;;
	echo $foo->$arr[1] ."
";
	echo $foo->{$arr}[1]  ."
";	
?>








 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn