閱讀129 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PHP5與PHP4的區別小議

PHP5與PHP4的區別小議:
    
    一、未100%向下兼容
    
    在php5中盡管大部分PHP4的代碼應該不用修改就能運行,還是應該留意以下不向下兼容的改變:
    
    有了一些新關鍵字。
    
    strrpos() 和 strripos()如今使用整個字符串作為 needle.
    
    非法使用字符串偏移量會導致 E_ERROR 而不是 E_WARNING.一個非法使用的例子:$str = 'abc'; unset($str[0]);.
    
    array_merge() 被改成隻接受數組。如果傳遞入非數組變量,對每個此類參數都會發出一條 E_WARNING 信息。要小心因為你的代碼有可能瘋狂發出 E_WARNING.
    
    PATH_TRANSLATED 服務器變量在 Apache2 SAPI 中不再暗中設定,這和 PHP 4 中的情形相反,如果 Apache 沒產生此值則其被設為和 SCRIPT_FILENAME 服務器變量一樣的值。此修改是為了遵守CGI 規範。更多信息參考手冊中 $_SERVER['PATH_TRANSLATED'] 的說明。此問題也影響到 PHP >= 4.3.2 的版本。
    
    Tokenizer 擴展不再定義T_ML_COMMENT 常量。如果把 error_reporting 設為 E_ALL,PHP 將產生一條消息。盡管 T_ML_COMMENT 從來都沒用到過,還是在 PHP 4 中定義了。在 PHP 4 和 PHP 5 中 // 和 都被解析為 T_COMMENT 常量。但是 PHPDoc 風格的注釋 ,自 PHP 5 開始被 PHP 解析,被識別為 T_DOC_COMMENT.
    
    如果 variables_order 包括“S”,$_SERVER 應該帶有 argc 和 argv 被產生。如果用戶特別配製係統不創建 $_SERVER,那此變量當然就不存在了。改變的地方是不管 variables_order 怎麼設定,在 CLI 版本中 argc 和 argv 總是可用的。本來 CLI 版不是總會產生全局變量 $argc 和 $argv 的。
    
    沒有屬性的對象不再被當成“empty”.
    
    有些情況下類必須在使用前被定義。這僅在使用了一些 PHP 5 的新特性(例如 interfaces)的時候發生。其它情況下行為都沒變。
    
    get_class(),get_parent_class() 和 get_class_methods() 如今返回的類/方法名和定義時的名字一致(區分大小寫),對於依賴以前行為(類/方法名總是返回小寫的)的老腳本可能產生問題。一個可能的解決方法是在腳本中搜索所有這些函數並使用 strtolower()。
    
    區分大小寫的改變也適用於魔術常量 __CLASS__,__METHOD__ 和 __FUNCTION__.其值都會嚴格按照定義時的名字返回(區分大小寫)。
    
    ip2long() 在傳遞入一個非法 IP 作為參數時返回 FALSE,不再是 -1.
    
    如果有函數定義在包含文件中,則這些函數可以在主文件中使用而與是否在 return() 指令之前還是之後無關。如果文件被包含兩次,PHP 5 會發出致命錯誤,因為函數已經被定義,而 PHP 4 不管這個。因此推薦使用 include_once() 而不要去檢查文件是否已被包含以及在包含文件中有條件返回。
    
    include_once() 和 require_once() 在 Windows 下先將路徑規格化,因此包含 A.php 和 a.php 隻會把文件包含一次。
    
    實例: strrpos() 和 strripos() 如今用整個字符串作為 needle
    
    <?php
    
    var_dump(strrpos(‘ABCDEF','DEF’)); //int(3)
    
    var_dump(strrpos(‘ABCDEF','DAF’)); //bool(false)
    
    ?>
    
    實例: 沒有屬性的對象不再被當成“empty”
    
    <?php
    
    class test { }
    
    $t = new test();
    
    var_dump(empty($t)); // echo bool(false)
    
    if ($t) {
    
    // Will be executed
    
    }
    
    ?>
    
    實例: 有些情況下類必須在使用之前定義
    
    <?php
    
    //works with no errors:
    
    $a = new a();
    
    class a {
    
    }
    
    //throws an error:
    
    $a = new b();
    
    interface c{
    
    }
    
    class b implements c {
    
    }
    
    ?>
    
    二、CLI 和 CGI
    
    PHP 5 中對 CLI 和 CGI 文件名作了些改變。PHP 5 中,CGI 版本被改名為 php-cgi.exe(以前是 php.exe),現在主目錄中的是 CLI 版本(之前是 cli/php.exe)。
    
    PHP 5 中引進了一種新模式:php-win.exe.這和 CLI 版本相同,隻除了 php-win 不輸出任何內容,因此不會提供控製台(屏幕上不會閃過“dos 窗口”)。此行為類似 php-gtk.
    
    PHP 5 中,CLI 版本總會產生全局變量 $argv 和 $argc 而不管 php.ini 是怎麼設的。即使將register_argc_argv設為 off 也不影響 CLI.
    
    參見命令行模式。
    
    三、移植配置文件
    
    由於 ISAPI 模塊的名字改了,從 php4xxx 改為 php5xxx,因此需要對配置文件作些修改。CLI 和 CGI 文件名也改了。更多信息請查看相應章節。
    
    移植 Apache 配置極其簡單。照下麵的例子來檢查需要做的修改:
    
    實例: 移植 Apache 配置文件到 PHP 5
    
    # 將下麵這行: LoadModule php4_module /php/sapi/php4apache2.dll # 改成這一行: LoadModule php5_module /php/php5apache2.dll
    
    如果 web 服務器是以 CGI 模式運行 PHP 的,應該注意 CGI 版本的名字從 php.exe 改為了 php-cgi.exe.在 Apache 中,應該照這樣改:
    
    實例: 移植 Apache 配置文件到 PHP 5,CGI 模式
    
    # 將下麵這行: Action application/x-httpd-php “/php/php.exe” # 改成這一行: Action application/x-httpd-php “/php/php-cgi.exe”
    
    其它的 web 服務器中,需要修改 CGI 或者 ISAPI 模塊的名字。
    
    四、新函數
    
    PHP 5 有了些新函數。下麵是列表:
    
    Arrays:
    
    array_combine() - 用一個數組作為鍵名,另一個數組作為值創建一個新數組
    
    array_diff_uassoc() - 計算數組的差別,並用用戶提供的回調函數作附加的索引檢查
    
    array_udiff() - 用回調函數比較數據來計算數組的差別
    
    array_udiff_assoc() - 計算數組的差別並作附加的索引檢查。用回調函數來比較數據
    
    array_udiff_uassoc() - 計算數組的差別並作附加的索引檢查。數據的比較和索引檢查都用回調函數來完成
    
    array_walk_recursive() - 對數組的每個成員遞歸使用用戶函數
    
    array_uintersect_assoc() - 計算數組的交集並作附加的索引檢查。用回調函數來比較數據
    
    array_uintersect_uassoc() - 計算數組的交集並作附加的索引檢查。數據和索引都用回調函數來比較
    
    array_uintersect() - 計算數組的交集。用回調函數來比較數據
    
    InterBase:
    
    ibase_affected_rows() - 返回前一個查詢影響到的行的數目
    
    ibase_backup() - 在服務管理器中發起一個後台任務並立即返回
    
    ibase_commit_ret() - 提交一個事務但不關閉
    
    ibase_db_info() - 請求有關數據庫的統計信息
    
    ibase_drop_db() - 刪除一個數據庫
    
    ibase_errcode() - 返回一個錯誤代碼
    
    ibase_free_event_handler() - 取消一個已注冊的事件句柄
    
    ibase_gen_id() - 遞增指定的發生器並返回其新值v

最後更新:2017-04-02 15:14:56

  上一篇:go 黑帽大會:Win8是最安全桌麵和移動係統
  下一篇:go 華為董事長孫亞芳登上 《福布斯》全球女強人榜