落后就要挨打,爱拼才会赢。有限的生命也可以创造奇迹,只要每天都有进步!
有一种拼博叫坚持...

首页>>PHP>>PHP5.3.X新特性总结

PHP5.3.X新特性总结

一、向后不兼容的变化
尽管绝大多数PHP5代码不需修改即可运行,但是请留意一些向后不兼容的变化:
1.所有PHP5.3.X附带的extension使用了新的参数解析API,如果传入不兼容的参数将导致函数返回NULL。
有部分例外情况,例如get_class()在发生错误的时候继续返回FALSE
2. array相关函数:natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique()不再接受object类型的参数,如果要使用,请先把object转换为数组。
3. SplFileInfo和其他目录相关的类返回的路径字符结尾处的“/”将被移除。
4. __toString魔术方法不再接受参数
5. __get, __set, __isset, __unset, 和 __call必须使用public并且不能再定义为静态方法
6. 魔术方法__call现在能调用private和protected方法。
7. 函数内include或者require一个文件,文件内将不能使用func_get_arg(), func_get_args() 和 func_num_args()函数。
8. 以下关键词成为保留关键词,不能以其为其他函数、类命名。
goto
namespace         

二、新功能
PHP 5.3.0提供了大量新功能
1.增加 goto “jump label”操作
例子:标签a要加上一个冒号,而且必须要在同一个文件内。也不能跳到循环里面,但是可以从循环里面跳出来。
goto a;
echo ‘Foo’;

a:
echo ‘Bar’;
?>
输出:Bar

2.增加命名空间(namespaces)的支持
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。

namespace MyProject; //致命错误- 命名空间必须是程序脚本第一语句
?>

三种使用namespace方法
2.1 引用namespace和类 假设namespace的程序为namespaced_class.php
namespace a\b;
class c{};
?>
引用方法(这里new的时候把完整的namespace及下面的类都引入进来了)
include ‘namespace_class.php’;

$nc = new a\b\c();
?>

2.2 部分引用
include ‘namespace_class.php’;
use a\b;

$nc2 = new c();
?>
这里use指定了命名空间后,在使用时,只需要引用命名空间的最后部分c即可.

2.3 自定义
include ‘namespace_class.php’;
use a\b\c as d;

$nc3 = new d();
?>
这里把命名空间下的指定类都用一个自定义的名称来代替了,十分方便

3.增加__callStatic()魔术方法
语法: mixed __callStatic ( string $name , array $arguments )
使用时,可见性未设置为public或未声明为static的时候会产生一个警告。
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。
$name参数是要调用的方法名称。$arguments参数是一个数组,包含着要传递给方法的参数。
class MethodTest
{
public static function __callStatic ( string $name , array $arguments ) {
echo “Calling static method {$name}”.implode(‘,’, $arguments).’\n’;
}
}
$obj = new MethodTest;
//$obj->runTest(‘in object context’);//会报错

MethodTest::runTest(‘in static context’);
?>
输出:Calling static method ‘runTest’ in static context

4.增加Closures函数
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。经常用作回调函数(callback)的参数。
匿名函数目前是通过Closure类来实现的。目前还不稳定,不适用于正式开发。

5.在类外也可使用const来定义常量
如:
const CONSTANT = ‘Hello World’;
等同于原来的:
define(CONSTANT, ‘Hello, World’);

6.三元运算符增加了一个快捷书写方式
原本格式为是(expr1) ? (expr2) : (expr3) ,如果expr1结果为True,则返回expr2的结果。
PHP5.3新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3 ,如果expr1结果为True,则返回expr1的结果 。

7.新的垃圾收集器(GC),并默认启用
为复杂和长时间运行脚本的执行结束周期释放内存的清理。
gc_enable(); //允许垃圾回收
var_dump(gc_enabled()); //true
var_dump(gc_collect_cycles()); 某个元素的清理
gc_disable(); //禁止垃圾回收
?>

三、新的参数
1. clearstatcache()
增加了可选参数clear_realpath_cache 和 filename .
2.copy() – 增加数据流环境参数($context)
bool copy(string $source,string $dest [,resource $context])
这里的$context是由stream_context_create()创建。
3. stream_context_create() – 增加可选数组参数 params .
4.fgetcsv() – 增加可选转义字符(escape character)参数 .
类似于fgets(),只不过fgetcsv()读取的是csv(逗号分隔取值)文件。转义字符只能有一个,默认是反斜杠’\’。
5.ini_get_all() – 增加可选details参数。默认是true .
array ini_get_all ([ string $extension [, bool $details = true ]] )
6.nl2br() – 增加可选 is_xhtml 参数.
默认是ture,可以兼容XHTML。
7.parse_ini_file() – 增加 scanner_mode。
默认是:INI_SCANNER_NORMAL .
8.round() – 增加 mode .(PS:现在不只是四舍五入这一种形式了)
四个参数:PHP_ROUND_HALF_UP(默认),
PHP_ROUND_HALF_DOWN,
PHP_ROUND_HALF_EVEN,
PHP_ROUND_HALF_ODD。
echo round(8.2, 0, PHP_ROUND_HALF_UP); //8
echo round(8.5, 0, PHP_ROUND_HALF_UP); //9
echo round(8.8, 0, PHP_ROUND_HALF_UP); //9

echo round(8.2, 0, PHP_ROUND_HALF_DOWN); //8
echo round(8.5, 0, PHP_ROUND_HALF_DOWN); //8
echo round(8.8, 0, PHP_ROUND_HALF_DOWN); //9

echo round(8.5, 0, PHP_ROUND_HALF_EVEN); //8
echo round(8.5, 0, PHP_ROUND_HALF_ODD); //9

9.strstr() 和 stristr() – 增加 before_needle .(PS:可以取指定字符前面的部分了)
如:
$email = ‘thisuc@16169.net’;
$name = strstr($email, ‘@’);
echo $name.’
‘; //@16169.net
$name = strstr($email, ‘@’, true);
echo $name; //thisuc

四、新函数
1.array_replace() – 替换传入的数组为一个数组。
array array_replace ( array &$array , array &$array1 [, array &$array2 [, array &$… ]] )
根据键值由第二个数组替换第一个,不是递归,后面的数组始终替换第一个。如
$base = array(‘orange’, ‘banana’, ‘apple’, ‘raspberry’);
$replacements = array(0 => ‘pineapple’, 4 =>’cherry’);
$repalcement2 = array(0 => ‘grape’);

$basket = array_replace($base, $repalcements, $repalcements2);
var_dump($baseket);
?>
输出:
array
0 => string ‘grape’ (length=5)
1 => string ‘banana’ (length=6)
2 => string ‘apple’ (length=5)
3 => string ‘raspberry’ (length=9)
4 => string ‘cherry’ (length=6)

2.array_replace_recursive() – 递归的替换数组中的元素。
跟array_replace相似,只不过array_replace_recursive()如果在值中包含数组,则会根据键值在进行一次替换。

3.class_alias() – 为用户定义的类建立一个别名。
boolean class_alias ([ string $original [, string $alias ]] )
4.forward_static_call() – 在方法内(method context)执行用户函数。
3.class_alias() – 为用户定义的类建立一个别名。
boolean class_alias ([ string $original [, string $alias ]] )
4.forward_static_call() – 在方法内(method context)执行用户函数。
6.gc_collect_cycles() – 强制收集已存在的垃圾回收数据
7.gc_disable() – 关闭回收引用收集器
gc_enable() – 激活回收引用收集器
gc_enabled() – 返回回收引用收集器的状态。
8. get_called_class() – 返回执行静态方法的类名。
9.gethostname() – 返回本地服务器当前的主机名。
10. lcfirst() – 将字符串第一个字符转换成小写。
11. parse_ini_string() – 解析配置字符串。
12. date_create_from_format()
返回给定的格式的新 DateTime 对象。
13.date_diff() – 返回两个 DateTime 对象的差。 date_get_last_errors() – 返回最近一次日期/时间操作产生的警告或者错误。
14.date_parse_from_format() – 获得给定日期的信息。
15. date_add() – 将一个 DateTime 对象增加某个数量的天、月、年、小时、分钟或者秒。 如:
16. date_sub() – 将一个 DateTime 对象减去某个数量的天、月、年、小时、分钟或者秒

五、新的类方法
1.Date/Time: DateTime::add() – 在一个DateTime类型上增加指定的日、月、年、小时、分、秒DateTime::createFromFormat() – 根据指定的格式返回新DateTime
DateTime::diff() – 返回两个DateTime的差
DateTime::getLastErrors() – 返回最近一次date/time操作的警告或错误信息
DateTime::sub() -在一个DateTime类型上减去指定的日,月年、小时、分、秒

2.Exception:
Exception::getPrevious() – 获取上次错误信息

3. Reflection:
3.1 ReflectionClass::getNamespaceName() – 返回类的命名空间名称
3.2 ReflectionClass::getShortName() – 返回类的短名(即不包含namespace部分)
3.3 ReflectionClass::inNamespace() – 返回namespace中是否定义了该类
3.4 ReflectionFunction::getNamespaceName() – 返回已定义该函数的namespace的名称
3.5 ReflectionFunction::getShortName() – 返回函数的短名(不包含namespace部分)
3.6 ReflectionFunction::inNamespace() – 返回函数是否已在namespace中定义
3.7 ReflectionProperty::setAccessible() – 设置非public属性是否能被访问

六、PHP 5.3.x 中不建议使用的功能
1. PHP 5.3.0 引入了两个新的错误级别:E_DEPRECATED和E_USER_DEPRECATED。
E_DEPRECATED表明不建议使用的函数或功能。
E_USER_DEPRECATED表明用户代码中不建议使用的功能,类似于E_USER_ERROR和E_USER_WARNING。

2. split()与spliti()
php5.3.0版本可以用preg_split()方法取代split(),如果不用正则表达式,尝试用速度更快的explode()方法。

3. mysql_db_query()
可用 mysql_select_db() 或 mysql_query() 代替。

4. ereg()
可用preg_match() 代替。

5. eregi_replace()
可用 preg_replace() 结合 ‘i’ 修饰符以代替。

6. set_magic_quotes_runtime()和它的别名magic_quotes_runtime()。
7. call_user_method(),可用call_user_func()代替。
8.call_user_method_array(),可用call_user_func_array() 代替。
9.define_syslog_variables()
10. session_register(), session_unregister(),ssession_is_registered(), 可用 $_SESSION 超全局变(superglobal)代替。
11.set_socket_blocking(), 可用 stream_set_blocking() 代替.
12. sql_regcase()
13.ssmysql_escape_string(), 可用 mysql_real_escape_string() 代替。

七、php.ini配置文件不建议使用的选项:
(启动时抛出‘PHP Warning’错误日志)
1.register_globals
决定是否将 EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量,默认为 off

2. register_long_arrays
设定 PHP 是否注册已过时的 $HTTP_*_VARS 之类的 预定义变量。如果为 On(默认值),则类似 $HTTP_GET_VARS 的 PHP 变量会被注册。如果不使用,为性能考虑建议关闭此选项,而使用超全局数组例如 $_GET替代之。
3. safe_mode
安全模式中,用户仅可以替换以在此列出的前缀开头的环境变量的值。默认地,用户将仅能 设定以PHP_开头的环境变量,(如: PHP_FOO=BAR)。 注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!

4. magic_quotes_runtime
设置为off时,对运行时产生的数据使用魔术引用

5. magic_quotes_gpc
设置为on时,在输入的GET/POST/Cookie数据里使用魔术引用

6.magic_quotes_sybase
设置为off时,采用 Sybase形式的魔术引用。

7. define_syslog_variable
设置为off时,是否定义各种的系统日志变量 如:$LOG_PID, $LOG_CRON, 等等。 关掉它是个提高效率的好主意。 运行时,你可以调用函数define_syslog_variables(),来定义这些变量

更多修改详见:http://www.php.net/ChangeLog-5.php#5.3.0

 

« 上一篇: 下一篇:»

相关文章:



发表评论

You must be logged in to post a comment.