Modern PHP 筆記(一):語言特性

系列筆記:
Modern PHP 筆記(一):語言特性
Modern PHP 筆記(二):良好實踐
Modern PHP 筆記(三):部署測試和調優(yōu)

現(xiàn)在正式加入世界上最好的語言大家庭了。jimbochen大佬給推薦了 Josh Lockhart 寫的,安道翻譯的《Modern PHP》. 準備記錄下一些學習筆記却嗡。剛剛入坑伤锚,如果理解的不對,歡迎指出滚朵。

這本書剛看湾碎,覺得內容很扎實尸闸。對PHP的整個生態(tài)有了更深的理解觉增。強烈推薦讀一下兵拢。順便吐槽下,簡書的markdown不支持toc逾礁,這個蠻影響體驗说铃。

第一章:新時代的PHP

PHP正在重生,得益于命名空間嘹履、性狀腻扇、閉包和內置的操作碼緩存等有用的特性

現(xiàn)狀

跳出了框架的束縛,依賴composer管理插件砾嫉,混搭合適的組件幼苛。

歷史

  • 創(chuàng)始人:拉斯姆斯·勒多夫
  • PHP tools:Personal Home Page Tools
  • 1998年,PHP3: PHP: Hypertext Preprocessor
  • PHP引擎: Zend Engine焕刮、HipHop Virtual Machine
  • 基于PHP之上的語言:Hack

第二章:特性

命名空間

目的:避免命名沖突

使用命名空間

    // 聲明命名空間
    namespace Oreilly\ModernPHP;
    // 廠商命名空間最重要舶沿,必須具有全局唯一性

    // 導入類和別名
    use Symfony\Component\HttpFoundation\Response as Res;

    // 導入函數
    use func Namespace\functionName;

    // 導入常量
    use constant Namespamce\CONST_NAME;

全局命名空間

    <?php
    namespace My\App;

    class Foo
    {
        public function doSomething()
        {
            $exception = new Exception();
        }
    }

Exception類沒有命名空間,在全局命名空間中配并,此時調用\My\App\Foo::doSomething()
報錯括荡。
正確寫法為:new \Exception()

使用接口

接口是兩個PHP對象之間的契約,其目的不是讓一個對象依賴另一個對象的身份溉旋,而是依賴另一個
對象的能力畸冲。我們不關心第三方代碼如何實現(xiàn)接口,只關心是否實現(xiàn)了指定接口观腊。

    // 操作的入參Documentale不是類邑闲,是接口
    class DocumentStore
    {
        public function addDocument(Documentable $document)
        {
            ...
            $document->getId();
            $document->getContent();
        }
    }

    // 接口定義
    interface Documentable
    {
        public function getId();

        public function getContent();
    }


    // 類1實現(xiàn)了接口
    class HtmlDocument implements Documentable
    {
        public function getId()
        {
            // ...
        }

        public function getContent()
        {
            // ...
        }
    }

    // 類2實現(xiàn)了接口
    class StreamDocument implements Documentable
    {
        public function getId()
        {
            // ...
        }

        public function getContent()
        {
            // ...
        }
    }

性狀trait

性狀有兩個作用:表明類可以做什么(像接口),提供模塊化實現(xiàn)(像類)

為什么使用性狀

繼承模型不好用時梧油,比如想讓兩個無關的PHP類具有類似的行為监憎?(e.g.零售店類和汽車類都想使用
地理編碼轉換成經緯度功能時)

  1. 方案一:繼承共同父類∩羲荩——不好鲸阔。讓兩個無關類繼承自同一祖先。
  2. 方案二:創(chuàng)建地理轉換接口迄委『稚福——好一點。但是兩個類都需要實現(xiàn)相同的代碼叙身,不符合DRY原則
  3. 方案三:使用性狀渔扎,直接在兩個類中混入性狀——最好

創(chuàng)建性狀

    <?php
    trait MyTrait {
        // 這里寫性狀實現(xiàn)
    }

使用性狀

    class MyClass
    {
        use MyTrait;
        // 類其他實現(xiàn)
    }

PHP會直接把性狀代碼粘貼在類中信轿,因此要注意兼容問題晃痴。

生成器generator

生成器是簡單的迭代器残吩。不同的是,不要求類實現(xiàn)Iterator接口倘核,每次只計算下一個值泣侮,不會在內存
中預先計算。提升性能紧唱。

創(chuàng)建生成器函數

  • 是的活尊,生成器是使用了yield關鍵字的函數。

  • 只產出值漏益,不返回值蛹锰。

  • 返回一個屬于Generator類的對象,可以用foreach()迭代绰疤。

  • 生成器每產生一個值內部狀態(tài)就會停頓铜犬,然后恢復,停頓...

      function myGenerator()
      {
          yield 'value1';
          yield 'value2';
      }
    

使用生成器

常用于需要節(jié)省內存時轻庆,比如生成一個大范圍的數癣猾、處理很多行的csv文件等。

    foreach (myGenerator() as $yieldValue) {
        echo $yieldValue, PHP_EOL;
    }

閉包

  • 閉包是創(chuàng)建時封閉周圍狀態(tài)的函數榨了。即便閉包所在環(huán)境不存在了煎谍,閉包中封裝的狀態(tài)依舊存在。
  • 匿名函數時沒有名稱的函數龙屉,非常適合作為函數或方法的回調呐粘。

PHP中將閉包和匿名函數視為相同概念。

創(chuàng)建閉包

與函數語法相同转捕,但實際上閉包是Closure類的實例作岖,不是函數。

附加狀態(tài)

必須調用閉包對象的bindTo()方法或者使用use關鍵字五芝,將狀態(tài)附加到PHP閉包上痘儡。

    $que = function ($query)use ($id) {
        // $id是外面變量
    }

bindTo()方法將閉包實例的內部狀態(tài)綁定到其他對象上,則閉包可以訪問綁定閉包的對象中受保護方法和私有成員變量枢步。

e.g.沉删,PHP框架經常使用bindTo()方法把路由URL映射到匿名函數。因此可以在匿
名函數中使用$this引用應用對象醉途。

Zend OPcache 字節(jié)碼緩存

PHP是解釋型語言矾瑰,PHP解釋器執(zhí)行PHP腳本時會解析代碼,將其編譯成 Zend 操作碼隘擎,然后執(zhí)行
字節(jié)碼殴穴。每次HTTP請求都會不斷解析、編譯、執(zhí)行采幌。緩存字節(jié)碼可以節(jié)省時間劲够,提高性能。

Zend OPcache 默認不啟用休傍,需要手動開啟并配置征绎。

內置HTTP服務器

從PHP 5.4 開始

啟動內置服務器

    // 根目錄
    php -S localhost:4000

自定義配置

    php -S localhost:8000 -c app/config/php.ini

路由器腳本

內置的服務器不支持.htaccess文件,因此很難使用前端控制器尊残。

前端控制器是一個PHP文件炒瘸,用于轉發(fā)所有的HTTP請求(通過.htaccess文件或者重寫規(guī)則實現(xiàn))淤堵。
前端控制器的職責是寝衫,分發(fā)請求,以及調度適當的PHP代碼拐邪。

內置服務器使用路由腳本彌補這個功能慰毅。處理HTTP請求前,先執(zhí)行路由器腳本扎阶,如果為false汹胃,則
返回請求的靜態(tài)資源URI,否則返回腳本的執(zhí)行結果东臀。

    php -S localhost:8000 router.php

判斷使用哪種服務器

    if (php_sapi_name() === 'cli-server'){
        // PHP 內置的服務器
    } else {
        // 其他 Web 服務器
    }

缺點

不能用在生產環(huán)境:

  • 一次只能處理一個請求
  • 只支持少量媒體類型
  • 通過路由器腳本支持少量URL重寫規(guī)則着饥,更高級不行

更多筆記還在讀書中O(∩_∩)O哈哈~

最后,照例記錄下一段很喜歡的話共勉惰赋。

過一個平凡無趣的人生實在太容易了宰掉,你可以不讀書,不冒險赁濒,不運動轨奄,不寫作,不外出拒炎,不折騰……但是挪拟,人生最后悔的事情就是:我本可以。  ——陳素封
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末击你,一起剝皮案震驚了整個濱河市玉组,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丁侄,老刑警劉巖惯雳,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绒障,居然都是意外死亡吨凑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸵钝,“玉大人糙臼,你說我怎么就攤上這事《魃蹋” “怎么了变逃?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怠堪。 經常有香客問我揽乱,道長,這世上最難降的妖魔是什么粟矿? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任凰棉,我火速辦了婚禮,結果婚禮上陌粹,老公的妹妹穿的比我還像新娘撒犀。我一直安慰自己,他們只是感情好掏秩,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布或舞。 她就那樣靜靜地躺著,像睡著了一般蒙幻。 火紅的嫁衣襯著肌膚如雪映凳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天邮破,我揣著相機與錄音诈豌,去河邊找鬼。 笑死决乎,一個胖子當著我的面吹牛队询,可吹牛的內容都是我干的。 我是一名探鬼主播构诚,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蚌斩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了范嘱?” 一聲冷哼從身側響起送膳,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丑蛤,沒想到半個月后叠聋,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡受裹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年碌补,在試婚紗的時候發(fā)現(xiàn)自己被綠了虏束。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡厦章,死狀恐怖镇匀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情袜啃,我是刑警寧澤汗侵,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站群发,受9級特大地震影響晰韵,放射性物質發(fā)生泄漏。R本人自食惡果不足惜熟妓,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一雪猪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滑蚯,春花似錦浪蹂、人聲如沸抵栈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽古劲。三九已至斥赋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間产艾,已是汗流浹背疤剑。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闷堡,地道東北人隘膘。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像杠览,于是被迫代替她去往敵國和親弯菊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容

  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 3,960評論 1 66
  • 內存是計算機非常關鍵的部件之一踱阿,是暫時存儲程序以及數據的空間管钳,CPU只有有限的寄存器可以用于 存儲計算數據,而大部...
    dreamer_lk閱讀 1,210評論 2 10
  • ziadoz在 Github發(fā)起維護的一個PHP資源列表软舌,內容包括:庫才漆、框架、模板佛点、安全醇滥、代碼分析、日志、第三方庫...
    Gundy_閱讀 6,310評論 4 192
  • 補昨天 去姑姑家吃飯 見姐姐和bb 現(xiàn)在的小孩競爭好大 姐姐壓力也很大 bb一直拉著我講他的飛機 看著他們感覺要思...
    rrreason閱讀 99評論 0 0
  • 你知道么? 國慶節(jié)怀喉,一個港星過生日书妻,鄭伊健。 Sir想問問: 在80后記憶里躬拢,他什么樣躲履? 是《古惑仔》氣勢逼人的大...
    Sir電影閱讀 882評論 1 10