PHP 5.3 5.4 5.5新特性(二)

摘要:因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了!所以整理了一下 一些特性,有可能不全,待添加。。。

2.PHP 5.4中的新特性
2.1.PHP 5.4中的新特性
2.1.1. Buid-in web server内置了一个简单的Web服务器

把当前目录作为Root Document只需要这条命令即可:

        $ php -S localhost:3300  

也可以指定其它路径:

        $ php -S localhost:3300 -t /path/to/root  

还可以指定路由:

        $ php -S localhost:3300 router.php  

2.1.2.Traits

Traits提供了一种灵活的代码重用机制,即不像interface一样只能定义方法但不能实现,又不能像class一样只能单继承。至于在实践中怎样使用,还需要深入思考。
魔术常量为__TRAIT__

        官网的一个例子:  
        trait SayWorld {  
                public function sayHello() {  
                        parent::sayHello();  
                        echo “World!/n”;  
                        echo ‘ID:’ . $this->id . “/n”;  
                }  
        }  
          
        class Base {  
                public function sayHello() {  
                        echo ‘Hello ‘;  
                }  
        }  
          
        class MyHelloWorld extends Base {  
                private $id;  
          
                public function __construct() {  
                        $this->id = 123456;  
                }  
          
                use SayWorld;  
        }  
          
        $o = new MyHelloWorld();  
        $o->sayHello();  
          
        /*will output: 
        Hello World! 
        ID:123456 
         */  

2.1.3. Short array syntax 数组简短语法

        $arr = [1,'james', 'james@fwso.cn'];  
        $array = [  
          "foo" => "bar",  
          "bar" => "foo"  
          ];  

2.1.4. Array dereferencing 数组值

        function myfunc() {  
            return array(1,‘james’, ‘james@fwso.cn’);  
        }  

我认为比数组简短语法更方便的是dereferencing,以前我们需要这样:

        $arr = myfunc();  
        echo $arr[1];  

在PHP5.4中这样就行了:

    $name = explode(“,”, “Laruence,male”)[0];
    explode(“,”, “Laru
    echo myfunc()[1];  

其他:

        $name = explode(“,”, “Laruence,male”)[0];  
        explode(“,”, “Laruence,male”)[3] = “phper”;  

本例要注意一个要点 http://www.laruence.com/2011/12/19/2409.html
2.1.5. Upload progress 文件上传

Session提供了上传进度支持,通过$_SESSION[“upload_progress_name”]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
详细的看http://www.laruence.com/2011/10/10/2217.html

2.1.6. JsonSerializable Interface [JSON 序列化对象]

实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。
参考http://www.laruence.com/2011/10/10/2204.html

2.1.7. Use mysqlnd by default

现在mysql, mysqli, pdo_mysql默认使用mysqlnd本地库,在PHP5.4以前需要:

        $./configure –with-mysqli=mysqlnd  

现在

        $./configure –with-mysqli  

以上来自:http://www.hdj.me/php54

2.1.8.实例化类

        class test{  
            function show(){  
        return ‘test’;  
            }  
        }  
        echo (new test())->show();  

2.1.9.支持 Class::{expr}() 语法

        foreach ([new Human("Gonzalo"), new Human("Peter")] as $human) {  
            echo $human->{‘hello’}();  
        }  

2.1.10.Callable typehint

        function foo(callable $callback) {  
        }  

则:

          foo(“false”); //错误,因为false不是callable类型  
          foo(“printf”); //正确  
          foo(function(){}); //正确  
        class A {  
          static function show() {  
            }  
        }  
          foo(array(“A”, “show”)); //正确  

2.1.11.函数类型提示的增强

由于php是弱类型的语言,因此在php 5.0后,引入了函数类型提示的功能,其含义为对于传入函数中的参数都进行类型检查,举个例子,有如下的类:

        class bar {  
        function foo(bar $foo) {  
        }  
        //其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:  
        function foo(array $foo) {  
        }  
        }  
        foo(array(1, 2, 3)); // 正确,因为传入的是数组  
        foo(123); // 不正确,传入的不是数组  

2.1.12.新增加了$_SERVER[“REQUEST_TIME_FLOAT”]

这个是用来统计服务请求时间的,并用ms来表示

        echo “脚本执行时间 “, round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), “s”;  

2.1.13. 让Json更懂中文(JSON_UNESCAPED_UNICODE)

        echo json_encode(“中文”, JSON_UNESCAPED_UNICODE);  
        //”中文”  

2.1.14. 二进制直接量(binary number format)

        $bin  = 0b1101;  
        echo $bin;  
        //13  

2.2 PHP 5.4.0 性能大幅提升, 修复超过100个bug.

废除了register_globals, magic_quotes以及安全模式。
另外值得一提的是多字节支持已经默认启用了,
default_charset从ISO-8859-1已经变为UTF-8.
默认发送“Content-Type: text/html; charset=utf-8”,
你再也不需要在HTML里写meta tag,也无需为UTF-8兼容而传送额外的header了。

删除的特性
最后,我们集中整理了几年来标记为已弃用的多个特性。这些特性包括 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat42、session.bug_compat_warn 以及 y2k_compliance。
除了这些特性之外,magic_quotes 可能是最大的危险。在早期版本中,未考虑因 magic_quotes 出错导致的后果,简单编写且未采取任何举措使自身免受 SQL 注入攻击的应用程序都通过 magic_quotes 来保护。如果在升级到 PHP 5.4 时未验证已采取正确的 SQLi 保护措施,则可能导致安全漏洞。

其他改动和特性
有一种新的“可调用的”类型提示,用于某方法采用回调作为参数的情况。
htmlspecialchars() 和 htmlentities() 现在可更好地支持亚洲字符,如果未在 php.ini 文件中显式设置 PHP default_charset,这两个函数默认使用 UTF-8 而不是 ISO-8859-1。
会话 ID 现在默认通过 /dev/urandom(或等效文件)中的熵生成,而不是与早期版本一样成为必须显式启用的一个选项。
mysqlnd 这一捆绑的 MySQL 原生驱动程序库现在默认用于与 MySQL 通信的各种扩展,除非在编译时通过 ./configure 被显式覆盖。
可能还有 100 个小的改动和特性。从 PHP 5.3 升级到 5.4 应该极为顺畅,但请阅读迁移指南加以确保。如果您从早期版本升级,执行的操作可能稍多一些。请查看以前的迁移指南再开始升级。

2.3.PHP5.4弃用功能

备受指责的 Register Globals 已从 PHP 中完全删除。十年来,该特性一直以其频繁发生的安全漏洞而著称。2002年该特性被设置为默认关闭。2009年发布的 PHP5.3 将该特性标记为“弃用”,想必从那时起,大部分开发人员已经不再使用它。
从 PHP 中移除的另一个不讨喜的特性是 Magic Quotes。Magic Quotes 本意是对字符串进行自动转义(escape)以试图避免 SQL 注入攻击。但是由于字符串的转义使用方法常与特定背景相关,因此,比起试图解决的问题,它反而造成了更多的问题。该特性同 Register Globals 一样,也在 2009 年被标记为“弃用”。
PHP 中的 break 和 continue 语句之后可以跟上一个参数用来指明跳出的循环层数。如果不指定参数,它会像 VB、C#或 Java 一样跳出最内层的循环。在 PHP 5.4 之前,开发人员可以向 break 语句传递一个变量,而现在只能传递常量。
PHP 允许参数按引用传递。在早期版本中,你可以通过为调用点添加修饰来指明变量按引用传递。在 PHP 5.4 中,该选项已被移除。相反,现代 PHP 编程只需要在函数声明时指定按引用传递即可。与 C# 不同,你不需要同时在声明和调用点指定按引用传递。

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/98467.html

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论