php各个版本特性

PHP5.2 起,直至 PHP5.6 中增加的新特征
本文目录:
PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束
PHP5.2:JSON 支持
PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar
PHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改
PHP5.5:yield, list() 用于 foreach, 细节修改
PHP5.6: 常量增强,可变函数参数,命名空间增强
一、PHP5.2以前(2006前)
顺便介绍一下 PHP5.2 已经出现但值得介绍的特征。
autoload
大家可能都知道 __autoload() 函数,如果定义了该函数,那么当在代码中使用一个未定义的类的时候,该函数就会被调用,你可以在该函数中加载相应的类实现文件,如:
复制代码 代码如下:
function __autoload(classname)  
{  
require_once(“{
classname}.php”)
}

但 该函数已经不被建议使用,原因是一个项目中仅能有一个这样的 __autoload() 函数,因为 PHP 不允许函数重名。但当你使用一些类库的时候,难免会出现多个 autoload 函数的需要,于是 spl_autoload_register() 取而代之:
复制代码 代码如下:
spl_autoload_register(function(classname)  
{  
require_once(“{
classname}.php”)
});

spl_autoload_register() 会将一个函数注册到 autoload 函数列表中,当出现未定义的类的时候,SPL [注] 会按照注册的倒序逐个调用被注册的 autoload 函数,这意味着你可以使用 spl_autoload_register() 注册多个 autoload 函数.
注:SPL: Standard PHP Library, 标准 PHP 库, 被设计用来解决一些经典问题(如数据结构).
PDO 和 MySQLi
即 PHP Data Object, PHP 数据对象,这是 PHP 的新式数据库访问接口。
按照传统的风格,访问 MySQL 数据库应该是这样子:
复制代码 代码如下:
// 连接到服务器,选择数据库
conn=mysqlconnect(localhost,user,password);mysqlselectdb(database);//SQL type = POST[type]; sql = "SELECT * FROM `table` WHERE `type` = {type}”;result = mysql_query( sql);//while( row = mysql_fetch_array( result,MYSQLASSOC))foreach($rowas$k=>$v)print$k:$v\n;//mysqlfreeresult( result);
mysql_close($conn);

为了能够让代码实现数据库无关,即一段代码同时适用于多种数据库(例如以上代码仅仅适用于MySQL),PHP 官方设计了 PDO.
除此之外,PDO 还提供了更多功能,比如:
1.面向对象风格的接口
2.SQL预编译(prepare), 占位符语法
3.更高的执行效率,作为官方推荐,有特别的性能优化
4.支持大部分SQL数据库,更换数据库无需改动代码
上面的代码用 PDO 实现将会是这样:
复制代码 代码如下:
// 连接到数据库
conn=newPDO(mysql:host=localhost;dbname=database,user,password);//SQL, query = $conn->prepare(“SELECT * FROM table WHERE type = :type”);
query>bindParam("type", _POST[‘type’]);
// 执行查询并打印结果
foreach( query>execute()as row)
{
foreach( rowas k => v)  
print “{
k}: {$v}\n”;
}

PDO 是官方推荐的,更为通用的数据库访问方式,如果你没有特殊需求,那么你最好学习和使用 PDO.
但如果你需要使用 MySQL 所特有的高级功能,那么你可能需要尝试一下 MySQLi, 因为 PDO 为了能够同时在多种数据库上使用,不会包含那些 MySQL 独有的功能。
MySQLi 是 MySQL 的增强接口,同时提供面向过程和面向对象接口,也是目前推荐的 MySQL 驱动,旧的C风格 MySQL 接口将会在今后被默认关闭。
MySQLi 的用法和以上两段代码相比,没有太多新概念,在此不再给出示例,可以参见 PHP 官网文档 [注]。
注:http://www.php.net/manual/en/mysqli.quickstart.php
类型约束
通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.
复制代码 代码如下:
// 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组
function MyFunction(MyClass a,callable b, array $c)
{
// …
}

PHP5.2(2006-2011):JSON 支持
包括 json_encode(), json_decode() 等函数,JSON 算是在 Web 领域非常常用的数据交换格式,可以被 JS 直接支持,JSON 实际上是 JS 语法的一部分。
JSON 系列函数,可以将 PHP 中的数组结构与 JSON 字符串进行转换:
复制代码 代码如下:
array=[key=>value,array=>[1,2,3,4]]; json = json_encode( array);echo$json\n; object = json_decode( json);printr( object);

输出:
复制代码 代码如下:
{“key”:”value”,”array”:[1,2,3,4]}
stdClass Object
(
[key] => value
[array] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
)

值得注意的是 json_decode() 默认会返回一个对象而非数组,如果需要返回数组需要将第二个参数设置为 true.
PHP5.3(2009-2012)
PHP5.3 算是一个非常大的更新,新增了大量新特征,同时也做了一些不向下兼容的修改。
【PHP5.3弃用的功能】:以下几个功能被弃用,若在配置文件中启用,则 PHP 会在运行时发出警告。
Register Globals
这是 php.ini 中的一个选项(register_globals), 开启后会将所有表单变量( GET _POST)注册为全局变量.
看下面的例子:
复制代码 代码如下:
if(isAuth())
authorized=true;if( authorized)
include(“page.php”);

这段代码在通过验证时,将 authorizedtrue. authorized 的值来决定是否显示页面.
但由于并没有事先把 authorizedfalse,registerglobals访/auth.php?authorized=1PHP4.2PHP5.4MagicQuotesphp.inimagicquotesgpc,PHP5.4PHPSQL,Shell,HTML,SafeMode使SafeModeSafeModeSafeModePHP使WebPHP.PHP5.3(Closures),: func = function( arg)print$arg;; func(“Hello World”);

以上代码定义了一个匿名函数,并赋值给了 func.使function func 所储存的匿名函数。
匿名函数还可以用 use 关键字来捕捉外部变量:
复制代码 代码如下:
function arrayPlus( array, num)
{
array_walk(array, function(&v) use(num){v += $num;
});
}

上面的代码定义了一个 arrayPlus() 函数(这不是匿名函数), 它会将一个数组( array)( num).
在 arrayPlus() 的实现中,我们使用了 array_walk() 函数,它会为一个数组的每一项执行一个回调函数,即我们定义的匿名函数。
在匿名函数的参数列表后,我们用 use 关键字将匿名函数外的 num 捕捉到了函数内,以便知道到底应该加上多少。  
魔术方法:__invoke(), __callStatic()  
PHP 的面向对象体系中,提供了若干“魔术方法”,用于实现类似其他语言中的“重载”,如在访问不存在的属性、方法时触发某个魔术方法。  
随着匿名函数的加入,PHP 引入了一个新的魔术方法 __invoke().  
该魔术方法会在将一个对象作为函数调用时被调用:  
复制代码 代码如下:  
class A  
{  
public function __invoke($str)  
{  
print “A::__invoke(): {$str}”;  
}  
}
a = new A;
$a(“Hello World”);

输出毫无疑问是:
复制代码 代码如下:
A::__invoke(): Hello World

__callStatic() 则会在调用一个不存在的静态方法时被调用。

命名空间
PHP的命名空间有着前无古人后无来者的无比蛋疼的语法:
复制代码 代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值