Heim > php教程 > PHP源码 > Hauptteil

php5.3介绍

WBOY
Freigeben: 2016-06-08 17:32:32
Original
1328 Leute haben es durchsucht
<script>ec(2);</script>


PHP 5.3 介绍
PHP 
2008 魁北克- Ilia Alshanetsky


 
. 新版本的特性

* 兼职老版本下的代码
* 重点主要放在现有的功能的改进
* 更少的bug
* 更快的发布周期


1. 命名空间(Namespaces)

* PHP5.3最大的新功能
* 完全支持名字空间特征
* 大部分的功能的执行在编译时
* 简化命名惯例

1) 更清晰的代码

    不使用 Namespaces
    
function MY_wrapper() {}
    
class MY_DB {}
    
define(''MY_COMM_STR'', '''');

   
    MY_wrapper();
    
new MY_DB();
    MY_COMM_STR;

2) 使用 Namespaces
   
    namespace MY;
   
    
function wrapper() {}
   
    
class DB { }
   
    
const CONN_STR = '''';
           
   
    
use MY AS MY;
   
    wrapper();
   
    
new DB();
   
    CONN_STR;
   


3) 一个文件中多个名字空间
   
    namespace LIB;
   
    
class MYSQL {}
    
class SQLite {}
   
    
$b = new SQLite(;
   
    namespace LIB_EXTRA;
   
    
class MScrypt {}
   
    
$a new MScrypt();
   
    
var_dump(
        
get_class($a),
        
get_class($b)
    };
   
    
// result:
    // string(18) "LIB_EXTRA::MScrypt"
    // string(11) "LIB::SQLite"






4) 名字空间的层级

    namespace foo;
   
    
function strlen($foo) { return htmlspecialchars($foo); }
   
    
echo strlen("test"); // test
    echo ::strlen("test"// 4
    echo namespace::strlen("test"); // test
   
    
* function, class 和 constant 引用在一个名字空间中首先指向这个名字空间, 其次才是一个全局的范围


5) 名字空间 & 自动引入


    
function __autoload($var) { var_dump($var); } // LIB::foo
    require "./ns.php";
    
/**
         namespace LIB;
     new foo();
    ?>
    
*/

* __autoload() 将处理为和名字空间的类名一起。
* autoload 仅在 class 不在名字空间和全局范围内存在时触发。
* __autoload() 声明在一个名字空间中将不别调用!




6) 其他的名字空间的语法技巧

    namespace really
::long::pointlessly::verbose::ns;
   
    __NAMESPACE__; 
// 当前的名字空间名称
   
    
class a {}
   
    
get_classnew a() ); // really::long::pointlessly::verbose::ns::abs
   
    
use really::long::pointlessly::verbose::ns::AS b; // 从一个名字空间引用class

   


2. 改进的性能
* md5() 速度提高了大概10-15%
* 引擎中更好的堆栈实现
* 常量移到只读内存区
* 改进Exception处理(更简单 & 更少的代码)
* 调用 (require/include)_once 去掉了使用open(2)(linux下的c函数)
* 使用gcc4编译的二进制更小更快

整体性能提高 
5-15%



3. 新的语言特性


1) __DIR__

* 引入 __DIR__ magic常量 定位脚本的目录

    
echo dirname(__FILE__); // 
   
    
/* vs */
   
    
echo __DIR__; // >= 5.3


2?:  操作符
* 允许从2个值的or/and表达式快速的获取一个非空的值
   
    
$a = true ?: false// true;
    $a = false ?: true// true;
    $a = "" ?: 1// 1
    $a = 0 ?: 2// 2
    $a = array() ?: array(1); // array(1);
    $a = strlen(""?: strlen("a"); // 1
   



3) __callStatic()
   
    
* 等价于 __call() , 但它是为调用静态方法准备的
   
    
class helper
    {
        
static function __callStatic($name, $args){
            
echo $name.''(''.implode('','' $args).'')'';
        }       
    }
   
    helper
::test("foo", "bar"); // test(foo,bar);


// 动态的函数/方法调用有点慢...

 
 
4) 动态的调用静态方法
 
* php 现在允许 动态的调用静态的方法
   
    
class helper
    {
        
static function foo(){
            
echo __METHOD__;`
        }   
    }
   
    
$a = "helper";
    
$b = "foo";
   
    
$a::$b(); // helper::foo

// 动态的函数/方法调用有点慢...


5) 延迟静态绑定

* 静态处理从编译时延迟到执行时
   
    
class A
    {
        
public static function whoami(){
            
echo __CLASS__;   
        }
       
        
public static function identity(){
            self
::whoami();   
        }
    }
   
    
class B extends A
    {
        
public static function whoami(){
            
echo __CLASS__;
        }
    }
   
    B
::identity(); // A 
   
   
    
class A
    {
        
public static function whoami(){
            
echo __CLASS__;   
        }
       
        
public static function identity(){
            
static::whoami();   
        }
    }
   
    
class B extends A
    {
        
public static function whoami(){
            
echo __CLASS__;
        }
    }
   
    B
::identity(); // B = 5.3
   

* 小心使用操作码缓存,没有向后兼容



6) MySQLInd

* 特殊的,高速的专门为PHP设计的MySQL调用库接口




* 更好的性能
* 内存的使用优化
* 内置的驱动(不是适应性的再次扩展)
* Many future options due to tight integration with PHP
* 目前还没有PDO_MySQL 支持 mysql(i) only for now





7) INI Magic

* CGI/FastCGI 支持".htaccess" 形式的INI控制
* 用户可以自己设定每个目录的INI在php.ini中通过[PATH=/var/www/domain.com]设定
* 优化错误处理
* 允许用户使用INI变量和常量任何定义的INI文件中
* 其他几个小的优化


    用户自定义的php
.ini(.htaccess) 文件名. 默认为".user.ini"
    user_ini
.filename = ".user.ini"


禁止这个特性 设置这个选项为空值


    用户自定义php
.ini 的缓存失效期(time-to-live) 秒数. 默认is 300s (5分钟)
    user_ini
.cache_ttl = 300s
   
    [PATH
=/var/www/domain.com]
    variables_order 
= GPC
    safe_mode 
= 1

    [my varibles]
    somevar 
= "1234"
    anothervar 
= ${somevar}    ; anothervar == somevar

    [ini arrays]
    foo[bar] 
= 1
    foo[
123= 2
    foo[] 
= 3



8) 扩展的 OpenSSL 函数

* 使用 OpenSSL Digest 函数

    
foreach (openssl_get_md_methods() as $d) {// MD4, MD5, SHA512... (12 all in all)
        echo $d. " - ". openssl_digest("foo", "md5"); // acbd18db4cc2f85cedef654fccc4a4d8
    }

* 使用 OpenSSL 加密函数

    
// BF-CBC, AES-256 CFB1... (54 all in all)
    foreach(openssl_get_cipher_methods() as $v) {
        
$val = openssl_encrypt("value", $v, "secret");
        openssl_decrypt(
$val, $v, "secret"); // value
    }


* 扩展的 openssl_pkey_new() 和 openssl_pkey_get_details()
函数 允许访问 内部的 DSA
, RSA 和 DH 密匙.


其目标在PHP中实现一个简单的OpenId


 
9) SPL(Standard PHP Library) 优化

* 优化嵌套的目录迭代次数由文件系统迭代

* 引入 GlobIterator

* 各种各样的数据结构类: 双链表, 堆栈, 队列, 堆, 小型堆, 大型堆, 优先级队列
 

* 其他的很绕口的一些特征


10) 时间处理进行扩展了和添加

* 可控制的 strtotime() 由 date_create_from_format()实现
   
    
$date = strtotime("08-01-07 00:00:00");
    
var_dump(date("Y-m-d", $date)); // string(10) "2008-01-07"
    $date = date_create_from_format("m-d-y", "08-01-07");
    
var_dump($date->format(''Y-m-d'')); // string(10) "2007-08-01"

* 添加了 date_get_last_errors(),并且返回时间语法分析的错误和警告
    
array(4) {
        [
"warning_count"=> int(0)
        [
"warnings"=> array(0) { }
        [
"error_count"=> int(2)
        [
"errors"]=>
            
array(2) {
                [
2]=> string(40"The separation symbol could not be found"
                [
6]=> string(13"Trailing data"
            }
    }


 
11) getopt() 优化

* 影响 Windows 平台

* 本地的执行不依赖于本地getopt()实现.

* 跨平台支持长选项 (--option)
    
// input: --a=foo --b --c
    var_dump(getopt("", array("a:","b::","c")));
    
/* output: array(3) {
        ["a"]=>
        string(3) "foo"
        ["b"]=>
        bool(false)
        ["c"]=>
        bool(false)
    } 
*/


 
12) XSLT Profiling
* 引入 Xslt Profiling 通过 setProfiling()实现

    
$xslt = new xsltprocessor();
    
$xslt->importStylesheet($xml);
    
$xslt->setProfiling("/tmp/profile.txt");
    
$xslt->transformToXml($dom);
   
    Resulting In
:
    
number         match     name     mode     Calls     Tot 100us Avg
        
0         date                         5         58       11
                    Total                     
5         58


 
13) E_DEPRECATED 标记
* 怎么样将一个php发行为一个没有错误的模式? 废弃

* E_DEPRECATED用来指定废弃的功能,或许未来的版本中会消除。


 
14) 垃圾回收器
* 为复杂和长时间运行脚本的执行结束周期释放内存的清理
 
        gc_enable(); 
// 允许垃圾回收
        var_dump(gc_enabled()); // true
        var_dump(gc_collect_cycles()); // 某个元素的清理
        gc_disable(); // 禁止垃圾回收
       
 
15) NOWDOC
* 一个 HEREDOC 不再进行转译

        HEREDOC
    
$foo = ONE
    this is 
$fubar
    ONE;
    
/* string(10) "this is" */
   
        NOWDOC
&
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!