PHP中的变量用一个美元符号后面跟变量来表示。变量名是区分大小写的。
变量与PHP中其它的标签一样遵循相同的规则。一个有效的变量名有字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。
按照正常的正则表达式,它将被表述为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Note: 在此所说的字母是 a-z,A-Z,以及 ASCII 字符从 127 到 255(0x7f-0xff)
Note: $this 是一个特殊的变量,它不能被赋值
可以这样对$this变量赋值
$name = 'this';
$$name = 'text'; // sets $this to 'text'
变量名;可以用中文
变量默认总是传值赋值。那也就是说,
当将一个表达式的值赋予一个变量时,
整个原始表达式的值被赋值到目标变量。这意味着,
例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,
将不会影响到另外一个变量。有关这种类型的赋值操作
PHP 也提供了另外一种方式给变量赋值:引用赋值。
这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。
改动新的变量将影响到原始变量,反之亦然
使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。
有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值
虽然在 PHP 中并不需要初始化变量,但对变量进行初始化是个好习惯。
未初始化的变量具有其类型的默认值 - 布尔类型的变量默认值是 FALSE,
整形和浮点型变量默认值是零,字符串型变量(例如用于 echo 中)默认值是空字符串以及数组变量的默认值是空数组。
预定义变量
PHP 提供了大量的预定义变量。
由于许多变量依赖于运行的服务器的版本和设置,及其它因素,
所以并没有详细的说明文档。一些预定义变量在 PHP 以命令行形式运行时并不生效。
Warning
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 的值。
Note: 可变变量
超级全局变量不能被用作函数或类方法中的可变变量。
Note:
尽管超全局变量和 HTTP_*_VARS 同时存在,但是它们并不是同一个变量,所以改变其中一个的值并不会对另一个产生影响。
如果某些 variables_order 中的变量没有设定,它们的对应的 PHP 预定义数组也是空的。
如果传入的变量包含.,PHP会把.转化为_
//INCORRECT
echo $_GET['chuck.norris'];
instead you must use:
//CORRECT
echo $_GET['chuck_norris'];
变量范围:
PHP 中全局变量在函数中使用时必须声明为 global
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;
$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,
值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
function test_global()
{
// 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['name'];
// Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。
echo $_POST['name'];
}
使用静态变量
变量范围的另一个重要特性是静态变量(static variable)。
静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
//静态变量与递归函数
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
Note:
静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。
静态声明是在编译时解析的
Note:
在函数之外使用 global 关键字不算错。可以用于在一个函数之内包含文件时。
来自 PHP 之外的变量
HTML 表单(GET 和 POST)
Note:
量名中的点和空格被转换成下划线。例如 变成了 $_REQUEST["a_b"]。
Note:
magic_quotes_gpc 配置指令影响到 Get,Post 和 Cookie 的值。如果打开,值 (It's "PHP!") 会自动转换成 (It's "PHP!")。
十多年前对数据库的插入需要如此转义,如今已经过时了,应该关闭。参见 addslashes(),stripslashes() 和 magic_quotes_sybase。
MAGE SUBMIT 变量名 ¶
当提交表单时,可以用一幅图像代替标准的提交按钮,用类似这样的标记:
当用户点击到图像中的某处时,相应的表单会被传送到服务器,并加上两个变量 sub_x 和 sub_y。它们包含了用户点击图像的坐标。
有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线(即 sub.x 和 sub.y),但 PHP 自动将点转换成了下划线。
HTTP Cookies
PHP 透明地支持 » RFC 6265定义中的 HTTP cookies。
Cookies 是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制。
可以用 setcookie() 函数设定 cookies。
Cookies 是 HTTP 信息头中的一部分,
因此 SetCookie 函数必须在向浏览器发送任何输出之前调用。
对于 header() 函数也有同样的限制。Cookie 数据会在相应的 cookie 数据数组中可用,
例如 $_COOKIE,$HTTP_COOKIE_VARS 和 $_REQUEST。更多细节和例子见 setcookie() 手册页面。
如果要将多个值赋给一个 cookie 变量,必须将其赋成数组。例如:
setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
注意在浏览器中一个 cookie 会替换掉上一个同名的 cookie,
除非路径或者域不同。因此对于购物车程序可以保留一个计数器并一起传递,例如:
变量名中的点
通常,PHP 不会改变传递给脚本中的变量名。然而应该注意到点(句号)不是 PHP 变量名中的合法字符。
$varname.ext; /* 非法变量名 */
这时,解析器看到是一个名为 $varname 的变量,后面跟着一个字符串连接运算符,
后面跟着一个裸字符串(即没有加引号的字符串,且不匹配任何已知的健名或保留字)'ext'。很明显这不是想要的结果。
出于此原因,要注意 PHP 将会自动将变量名中的点替换成下划线
确定变量类型
因为 PHP 会判断变量类型并在需要时进行转换(通常情况下),因此在某一时刻给定的变量是何种类型并不明显。PHP 包括几个函数可以判断变量的类型,
例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string()。
常量
常量是一个简单值的标识符(名字)。如同其名称所暗示的,
在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。
常量默认为大小写敏感。传统上常量标识符总是大写的
和 superglobals 一样,常量的范围是全局的。不用管作用区域就可以在脚本的任何地方访问常量
define('MIN_VALUE', '0.0'); // RIGHT - Works OUTSIDE of a class definition.
//const MIN_VALUE = 0.0;RIGHT - Works both INSIDE and OUTSIDE of a class definition.
define('echo', 'My constant value');
echo constant('echo'); //输出成功
魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,
只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:
几个 PHP 的“魔术常量”
名称 说明
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之变量和常量的更多相关文章
-
Java程序,基本数据类型、、数据类型转换、变量和常量、常用运算符
一.基本数据类型 整数类型:byte.short. int(常用).long(较常用) 定义某个变量 int a=10: 浮点类型(小数):float.double(常用) ...
-
PHP中的变量与常量详解
几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外.本节将介绍PHP语言中的变量和常量的应用方法. 一.什么是变量和常量 在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不 ...
-
Java 静态变量,常量和方法
static 关键字 例如:在球类中使用PI这个常量,可能除了本类需要这个常量之外,在另外一个圆类中也需要使用这个常量.这时没有必要 在两个类中同时创建PI这个常量,因为这样系统会将这两个不在同一个类 ...
-
[.net 面向对象编程基础] (5) 基础中的基础——变量和常量
[.net面向对象编程基础] (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...
-
iOS开发Swift篇—(二)变量和常量
iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...
-
php标记,变量,常量
php标记 语法:有4种书写格式 1.<?php ... ?> 强烈推荐使用. 如果当前 php的代码段,是整个文档的最后一段,可以省略结束标记?(建议省略) 每句语句都要以分号;结束. ...
-
Swift学习笔记--变量与常量
1.Swift是一门强类型语言,不能为变量赋予其自身数据类型之外的值: 2.声明变量使用var关键字,声明常量使用let关键字: 3.声明变量或常量时没有对其指定类型且赋予了初值,则编译器会自动推断常 ...
-
Oracle基础 PL-SQL编程基础(1) 变量和常量
一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...
-
李洪强iOS开发Swift篇—02_变量和常量
李洪强iOS开发Swift篇—02_变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3. ...
-
C语言基础学习基本数据类型-变量和常量
变量和常量 什么是变量和常量?有些数据在程序运行前就预先设定,并在运行过程中不发生变化,称之为常量:有些数据在程序运行中可能发生变化或被赋值,称之为变量. 使用变量前必须先声明一个变量.变量定义的语法 ...
随机推荐
-
我的MYSQL学习心得(二) 数据类型宽度
我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
-
高性能分布式内存队列系统beanstalkd(转)
beanstalkd一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook ...
-
Click Models for Web Search(1) - Basic Click Models
这篇文章主要是介绍一些基本的click model,这些不同的click model对用户与搜索结果页的交互行为进行不同的假设. 为了定义一个model,我们需要描述出observed variabl ...
-
Xamarin自定义布局系列——PivotPage,多页面切换控件
PivotPage ---- 多页面切换控件 PivotPage是一个多页面切换控件,类似安卓中的ViewPager和UWP中的Pivot枢轴控件. 起初打算直接通过ScrollView+StackL ...
-
ActiveMQ进阶学习
本文主要讲述ActiveMQ与spring整合的方案.介绍知识点包括spring,jms,activemq基于配置文件模式管理消息,消息监听器类型,消息转换类介绍,spring对JMS事物管理. 1. ...
-
Who do you want to be bad? (谁会是坏人?)人工智能机器小爱的问话
人工智能的语言理解一直是一个千古谜团. 正如人工智能机器小爱(A.L.I.C.E)的问话:“Who do you want to be bad ?(谁会是坏人?)” 纵观世界上的140多种语言,汉语是 ...
-
Android源码解析——LruCache
我认为在写涉及到数据结构或算法的实现类的源码解析博客时,不应该急于讲它的使用或马上展开对源码的解析,而是要先交待一下这个数据结构或算法的资料,了解它的设计,再从它的设计出发去讲如何实现,最后从实现的角 ...
-
Linux 驱动——Button驱动1
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/i ...
-
MyEclipse免费使用
import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; im ...
-
java实验报告二
一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...