關於PHP 5.4 你所需要知道的

2021-01-10 網易手機

PHP 5.4來了,這是自5.3後的又一次主版本升級。此次升級改動較為顯著,刪除了一些過氣兒的函數,帶來了高達20%的速度提升和更少的內存使用。

新特性與改動

此次更新的關鍵新特性,包括:新增traits,更精簡的Array數組語法,供測試使用的內建webserver,可以閉包使用的$this指針,實例化類成員訪問,<?=標記永遠生效 等等……

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了。

Traits

Traits (橫向重用/多重繼承)是一組結構很像「類」(但不能實例化)的方法,它可以讓開發人員在不同的類中輕鬆地重用方法。 PHP為單繼承語言,子類只能繼承一個父類,於是Traits來了。

Traits的最佳應用是多類之間可以共享相同的函數。打個比方,我們要做個網站,需要使用Facebook和Twitter的APIs。我們要建2個類,如果是以前,我們需要寫一個cURL的方法並且複製/粘貼到兩個類中。現在不用了,使用Traits重用代碼吧,這次真正地遵循了DRY(Don’t Repeat Yourself)原則。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

trait cURL

{

    public function curl($url)

    {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $output = curl_exec($ch);

        curl_close($ch);

        return $output;

    }

}

 

class Twitter_API

{

    use cURL;

    public function get($url)

    {

        return json_decode($this->curl('http://api.twitter.com/'.$url));

    }

}

 

class Facebook_API

{

    use cURL;

    public function get($url)

    {

        return json_decode($this->curl('http://graph.facebook.com/'.$url));

    }

}

 

$facebook = new Facebook_API();

echo $facebook->get('500058753')->name;

 

echo (new Facebook_API)->get('500058753')->name;

$foo = 'get';

echo (new Facebook_API)->$foo('500058753')->name;

echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name;

看明白了嗎?沒有?那你來瞅瞅更簡單的例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

trait Hello

{

    public function hello()

    {

        return 'Hello';

    }

}

 

trait Cichui

{

    public function cichui()

    {

        return ' cichui';

    }

}

 

class HelloCichui

{

    use Hello, Cichui;

    public function the_end()

    {

        return '!';

    }

}

 

$o = new HelloCichui;

echo $o->hello(), $o->cichui(), $o->the_end();

echo (new Hello)->hello(), (new Cichui)->cichui(), (new HelloCichui)->the_end();

內建的Web-Sever

在Web開發中,Apache HTTPD是PHP的最佳拍檔。有時,你開發時用不上需要配置httpd.conf的apache大殺器,而只需要一個可以在命令行中使用的超小型Webserver. 感謝PHP(先感謝國家),PHP 5.4這次內建了CLI Web server。(PHP CLI webserver僅供開發使用,謝絕產品用途)

舉個慄子(windows平臺):

步驟一:建立web根目錄, Router和Index

在硬碟根目錄(比如C盤)建立一個public_html目錄,目錄裡新建一個router.php文件,把以下代碼複製粘貼進去:

1

2

3

4

5

6

7

8

9

10

11

<?php

if (preg_match('#\.php$#', $_SERVER['REQUEST_URI']))

{

    require basename($_SERVER['REQUEST_URI']);

}

else if (strpos($_SERVER['REQUEST_URI'], '.') !== false)

{

    return false;

}

?>

再來新建一個index.php文件,複製粘貼以下代碼:

1

2

3

4

<?php

echo 'Hello cichui.com Readers!';

?>

編輯你的php.ini文件,找到」include_path」一行,把c:\public_html添加進去(分號分隔):

1

include_path = ".;C:\php\PEAR;C:\public_html"

存檔退出,看下一步

步驟二:運行Web-Server

切換到php的安裝目錄,敲下最關鍵的命令—運行Web-server

php -S 0.0.0.0:8080 -t C:\public_html router.php

開始了嗎?不要關閉窗口,如果進程關閉Web server也跟著關閉了。

打開瀏覽器:訪問http://localhost:8080/index.php吧,

Hello cichui.com Readers!

看到了吧?對,就是這個!

提示1:你可以考慮自建一個php-server.bat的批處理,扔到桌面上以後就可以雙擊啟動了。

提示2:使用0.0.0.0而不是localhost,可以保證外網不會訪問到你的web serve。

精簡的Array數組語法

PHP 5.4為您奉上精簡的array數組語法:

1

2

3

4

5

6

7

8

9

10

$fruits = array('apples', 'oranges', 'bananas');

 

$fruits = ['apples', 'oranges', 'bananas'];

 

$array = [

    'foo' => 'bar',

    'bar' => 'foo'

];

當然,舊語法依舊有效,我們多了一種選擇。

數組成員訪問解析(Array dereferencing*)

處理數組再也不需要臨時變量了。

假設我們需要獲取Fang Bin Xin的middle name,

echo explode(『 『, 『Fang Bin Xin』)[1]; // Bin

PHP 5.4之前,我們需要這樣:

$tmp = explode(『 『, 『Fang Bin Xin』);

echo $tmp[1]; // Bin

現在,我們可以這樣玩了:

echo end(explode(『 『, 『Fang Bin Xin』)); // Xin

再來個高級點的例子:

1

2

3

4

5

function foobar()

{

    return ['foo' => ['bar' => 'Hello']];

}

echo foobar()['foo']['bar'];

*瓷錘注: Array dereferencing直譯應為數組解除引用,效果不佳。其實更準確的翻譯應為:「對函數返回結果的數組成員訪問解析支持」,詳見PHP官方解釋。

匿名函數中的$this

現在,你可以在類實例中通過$this引用一個匿名函數(也叫閉包函數)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

class Foo

{

    function hello() {

        echo 'Hello Cichui!';

    }

 

    function anonymous()

    {

        return function() {

            $this->hello();

        };

    }

}

 

class Bar

{

    function __construct(Foo $o)

    {

        $x = $o->anonymous();

        $x();

    }

}

new Bar(new Foo);

其實以前也能將就用,就是有點費勁:

1

2

3

4

5

6

7

function anonymous()

{

    $that = $this;

    return function() use ($that) {

        $that->hello();

    };

}

<?= 永遠有效

無論php.ini中如何配置,short_open_tag, 也就是<?=(php標記+echo)永遠有效。現在,你可以安全地使用 <?=$title?> 替換以前的<?php echo $title;?>了。

支持二進位直接量

八進位(oct),前面加0;十六進位(hex),前面加0x;二進位(bin),現在在前面加0b就可以了

1

2

3

4

echo 0b11111;

echo 31;

echo 0x1f;

echo 037;

函數類型提示

自PHP 5.1起,類型提示支持對象和數組,PHP 5.4開始支持callable。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

function my_function(callable $x)

{

    return $x();

}

 

function my_callback_function(){return 'Hello Cichui!';}

 

class Hello{static function hi(){return 'Hello Cichui!';}}

class Hi{function hello(){return 'Hello Cichui!';}}

 

echo my_function(function(){return 'Hello Cichui!';});

echo my_function('my_callback_function');

echo my_function(['Hello', 'hi']);

echo my_function([(new Hi), 'hello']);

高精度計時器

此次引入了$_SERVER['REQUEST_TIME_FLOAT']數組變量,微秒級精度(百萬分之一秒,float類型)。對於統計腳本運行時間會非常有用:

1

echo 'Executed in ', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2)

小結

總之,此次PHP 5.4升級進行大量的改動。 是時候升級了。

PHP 5.5又將給我們帶來什麼,你又有那些期待呢?

原文:http://net.tutsplus.com/tutorials/php/php-5-4-is-here-what-you-must-know/

翻譯:瓷錘

本文來源:cnbeta 責任編輯: 王曉易_NE0011

相關焦點

  • php 中關於時區的那點事
    原來的時間標準是格林尼治標準時間,隨著精確計時的發展需要,已被新的時間標準所取代,目前的時間標準是世界協調時.現在有了統一的時間標準,不同地區的時間就可以統一換算成世界協調時再轉換成當地時間了,再也不會出現同一時刻不同時間了!
  • Php常見問題總結
    2:調試你的程序在運行時必須知道某個變量為何值。我是這樣做的,建立一文件debug.php,其內容如下: <?PHP3行 Session_Start();//之前在第一行已經有輸出4行 .....5行 ?>==========================================提示1:凡是出現"........headers already sent.........."
  • PHP實例——PHP創建動態圖像
    在安裝完這三個組件後,還需要重新配置一次PHP,這也是你對採用DSO方式安裝PHP感到慶幸的地方之一。  根據所安裝的GD庫文件的版本將決定你是否能創建GIF或PNG格式的圖形文件。如果安裝的是gd-1.6或以前的版本,可以使用GIF格式的文件但不能創建PNG格式,如果安裝的是gd-1.6以後的版本,可以創建PNG文件但不能創建GIF格式的文件。      創建一幅簡單的圖像也需要用到許多的函數,我們將一步一步地進行說明。
  • 怎麼理解php中的數組?php的數組創建和使用方法是什麼?
    php數組的定義數組就是值類型相同的變量的集合,在PHP中的一種常用的複合數據類型,數據可以存放很多的數據,可以存儲任何類型的數據。我們可以把變量當做一個包含值得盒子,那麼可以把數組當做當成一個帶有隔層的盒子,每一層都可以存放一個值。
  • php常量是什麼?它和變量有什麼區別?
    為了能讓更多的人學好php,小編結合自己的理解和自學時所做的筆記,整合了一些知識點,並藉助百家號這個大平臺分享給大家,希望對大家有所幫助!今天小編將分享的是php常量,以及它和變量的區別。二、php常量1、什麼是php常量?所謂常量就是不能改變的量,php常量一旦被定義,就不能被改變或取消定義。這是官方的解釋,也是最權威的解釋。
  • php中函數禁用繞過的原理與利用
    下面看看在php中如何配合利用達成bypass disable。php中的利用php中主要是需要配合putenv函數,如果該函數被ban了那麼也就沒他什麼事了,所以bypass前需要觀察disable是否ban掉putenv。
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    寫文章不僅是對社區的一種回報,還可以讓你找到志趣相投的人,在一個狹小的領域內得到專業人員的指教,並進一步加深你對研究領域的理解。事實上,本篇文章正是有關這些時刻之一。在本篇文章中,除了那些我看電視節目和玩遊戲的時間,我敘述了在過去六個月的幾乎所有空閒時間裡所做的探索。
  • DVBBS php轉換工具使用教程
    目前轉換程序只有四種,即:1、動網的ASP7.1 AC 轉到 動網PHP1.02、動網的ASP7.1 MSSQL 轉到 動網PHP1.03、DISCUZ4.1 轉到 動網PHP1.04、DISCUZ5.0 轉到 動網PHP1.0一、說明:1、訪問你的轉換路徑,各文件對應的轉換說明如下2、asp71ac-to-php10
  • 關於借款你所需要知道的經濟知識
    借款分為短期借款和長期借款,關於負債流動性劃分應當反應在資產負債表日有效的合同安排,對於在資產負債表日起一年內到期的負債,企業有意圖且有能力自主地將清償義務展期至資產負債表日後一年以上的應當分類為非流動負債;不能自主展期的,即使在資產負債表日後、財務報告批准報出日前(日後事項期間)籤訂了重新安排清償協議
  • 鳥哥:讓你的 PHP 7 更快之 Hugepage
    關於Hugepage是啥,簡單的說下就是默認的內存是以4KB分頁的,而虛擬地址和內存地址是需要轉換的, 而這個轉換是要查表的,CPU為了加速這個查表過程都會內建TLB(Translation Lookaside Buffer), 顯而易見如果虛擬頁越小,表裡的條目數也就越多,而TLB大小是有限的,條目數越多TLB的Cache Miss也就會越高, 所以如果我們能啟用大內存頁就能間接降低這個
  • php基礎通關大挑戰,看看你能過幾關!
    繼續上一節的內容,通過試題的方式查缺補漏,看看你的php基礎知識還有哪些漏洞!1.在php中,以下代碼列印的結果是?<?php$RESULT =11+011+0x11;echo "$RESULT";?
  • 關於地球5件你所不知道的事
    五個有關地球你不知道的事奧秘?循環,海洋中的火山爆發而形成新的島嶼與陸地,這是一個公認的事實。但是很多人並不知道我們腳下的土地其實是循環利用的。巖漿從地殼內部噴發後,會流到地表然後硬化變成巖漿巖。地殼板塊運動的同時,推動巖石向上運動,是他們緊密結合基層沉積巖。隨著時間的推移,這些巖石會隨地殼運動進入地下,重新被加熱,然後形成變質巖。
  • PHP文件包含漏洞利用思路與Bypass總結手冊(二)
    session.serialize_handlerPHP中處理用戶會話信息的主要是下面定義的兩種方式session.serialize_handler = php 一直都在(默認方式) 它是用 |分割session.serialize_handler = php_serialize php5.5之後啟用 它是用serialize反序列化格式分割
  • 關於玻尿酸和PRP,你所需要知道的事情
    跟大家分享了我最近一次進廠維修的經歷,而在錄這個視頻之前也上微博徵集了一些相關的問題,今天就來盡我所能地解答一番,快來戳視頻看看吧首先,如果你想要了解:「日本醫美語言問題」、「去日本做醫美是否有隱形消費」、「關於日本埋線的相關事宜」等問題……不妨先參考下之前這幾篇文章,都已經寫得比較詳細了Q1:關於本次醫美手術的價格在日本打玻尿酸通常是按部位來收費的
  • PHP 框架 QueryPHP 1.0.3 發布,兼容 PHP 8.0 和 PHP 8.1
    最後一次主要更新,未來僅僅做安全補丁,不再繼續維護,這也是最後一個支持 PHP 7.4 的版本。 1.1.* 版本將以 PHP 8.0 作為最低版本,已經發布 1.1.0-alpha.1 版本。  關於 QueryPHP QueryPHP 是一款現代化的高性能 PHP 漸進式協程框架, 我們還是主要面向傳統 PHP-FPM 場景,以工程師用戶體驗為歷史使命,讓每一個 PHP 應用都有一個好框架。
  • 臻解密 | 關於ACMG你需要知道的有這些
    中文在線地址:http://acmg.cbgc.org.cn/doku.php?id=startRichards S, Aziz N, Bale S, et al.Genetics in medicine, 2015, 17(5): 405.Li M M, Datto M, Duncavage E J, et al.
  • php知識大通關——常見函數功能
    接上節內容,仍然以習題的方式講解php常見函數及功能!php常見函數1、在php中,下面哪個方法使用 PHP 連接 MySQL 資料庫?2、在php中,下面哪個函數用於在 PHP 中獲取環境變量? search() environment() env() getenv()解析:PHP 中提供了一個 getenv() 函數來訪問所有環境變量的值。3、下面哪個異常處理類方法在發生錯誤時檢索錯誤消息?
  • 關於諾貝爾科學獎,你需要知道這些……
    一年一度的諾貝爾獎頒獎季即將在4天後到來。瑪麗·居裡(Marie Curie)| 圖 維基百科在今年的諾獎揭曉之前,你需要知道這些知識——這樣,即使你不明白諾獎科學家到底在研究些什麼,至少可以在談論諾獎這個熱門話題時,不至於顯得太落伍。
  • php基礎大通關——十分鐘了解php基礎知識點之二
    本節我們繼續通過練習題的方式來熟悉php的基礎知識點。1. echo 和 print 有什麼區別?php常用函數3. Joomla 在 PHP 中是什麼?4. set_time_limit() 中設置的默認執行時間是多少? 20 秒 30 秒 40 秒 50 秒解析:set_time_limit — 設置腳本最大執行時間,默認為 30 秒。5. 我能像在 Perl 中那樣從 PHP 腳本生成 DLL 文件嗎? 可以 不行解析:php是腳本語言,不能生成.exe或者DLL文件。
  • 關於氨基葡萄糖,你至少需要知道這 5 點!
    關於氨基葡萄糖,你至少需要知道以下 5 點。一、氨基葡萄糖是一種什麼藥?關節疼痛及壓痛是骨關節炎最為常見的臨床表現,骨關節炎的主要病理特點為關節軟骨變性破壞。溫馨提示:目前大多數的臨床研究都是採用硫酸氨基葡萄糖,關於硫酸氨基葡萄糖的有效證據較多。四、糖尿病患者可否服用氨基葡萄糖?氨基葡萄糖在葡萄糖代謝中發揮一定作用,可增加骨骼肌的胰島素抵抗。已有口服氨基葡萄糖引起血糖或血脂升高的報導,有糖尿病或心血管疾病風險的患者,建議對血糖或血脂進行監測。