php之变量和常量
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语言基础学习基本数据类型-变量和常量
变量和常量 什么是变量和常量?有些数据在程序运行前就预先设定,并在运行过程中不发生变化,称之为常量:有些数据在程序运行中可能发生变化或被赋值,称之为变量. 使用变量前必须先声明一个变量.变量定义的语法 ...
随机推荐
- Selenium:注解@FindBy、@FindBys、@FindAll的用法
方式有3种:@FindBy.@FindBys.@FindAll.下文对3中类型的区别和使用场景进行介绍 1)@FindBy @FindBy(id= "A") private Web ...
- 译:3.RabbitMQ Java Client 之 Publish/Subscribe(发布和订阅)
在上篇 RabbitMQ 之Work Queues (工作队列)教程中,我们创建了一个工作队列,工作队列背后的假设是每个任务都交付给一个工作者. 在这一部分,我们将做一些完全不同的事情 - 我们将向多 ...
- linux每日命令(22):find命令参数详解
一. name选项 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用. 可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来. 不管当前路径是什么,如果想要 ...
- Badboy教程
Badboy教程 摘自:Badboy-系列教程-资料整理 2016-11-30 1 界面介绍 2 录制 3 创建suites,tests,steps和Template 4 运行脚本 5 参数化 Add ...
- js 规范
1.原型链的弊端是不支持多重继承.记住,原型链会用另一类型的对象重写类的 prototype 属性 2.注意:调用 ClassA 的构造函数,没有给它传递参数.这在原型链中是标准做法.要确保构造函数没 ...
- USB学习笔记连载(二十一):CY7C68013A进行数据传输(一)
官方手册中给出了bulkloop参考例程,此例程是PC从端口2发送出数据,然后从端口6接收到数据,那么根据这个思想,可以进行修改,使得PC机接收到的数据不是从EP2发送过来的,而是从外部逻辑,比如FP ...
- Private表示该属性(方法)为只有本类内部可以访问(类内部可见)。
Public表示该属性(方法)公开: (想用private还要用set和get方法供其他方法调用,这样可以保证对属性的访问方式统一,并且便于维护访问权限以及属性数据合法性) 如果没有特殊情况,属性一定 ...
- 上网爱快?EasyRadius FOR 爱快V2接口测试版正式推出,欢迎广大爱迷们测试噢
…… …… 有些人问:为什么上面要打省略号?那些因为此处省略无数字,但是我还是要和大伙们谈谈EasyRadius支持爱快的故事 早在2013年的时候,我们内部就有发布爱快接口,但是由于当时V1的爱快, ...
- 怎样利用Heartbeat与Floating IP在Ubuntu 14.04上创建高可用性设置
提供 ZStack社区 内容简单介绍 Heartbeat是一款开源程序,负责将集群基础设施容量--包括集群成员与消息收发--交付至客户server. Hearbeat在高可用性server基础设施其中 ...
- 转: jvm调优参数总结
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...