PHP開發要點與技巧總結(一)

来源:http://www.cnblogs.com/XiongMaoMengNan/archive/2017/10/17/7205312.html
-Advertisement-
Play Games

Lambda表達式(匿名函數)實現了一次執行且無污染的函數定義,是拋棄型函數並且不維護任何類型的狀態。閉包在匿名函數的基礎上增加了與外部環境的變數交互,通過 use 子句中指定要導入的外部環境變數。C字元串以空字元('\0')為結束標誌,這使得C字元串不能保存像圖片、音頻、視頻、壓縮文件這樣的二進位... ...


  • Opcache:Opcache 來源於Zend Optimizer+改名,主要作用是通過將 PHP 腳本預編譯的位元組碼存儲到共用記憶體中來提升 PHP 的性能, 存儲預編譯位元組碼的好處就是省去了每次載入和解析 PHP 腳本的開銷,但是對於I/O開銷如讀寫磁碟文件、讀寫資料庫等並無影響。Opcache 很有可能取代 APC 的位置,雖然沒有 APC 那樣的 user cache 功能。另外 Opcache 可能與eaccelerator、xcache 或 apc 等類似組件相衝突。
  • PHP-FPM進程池:FastCGI Process Manager 的master process是常駐記憶體的,在進程池中動態創建並管理多個進程,可以有效控制記憶體和進程並平滑重載PHP配置,在發生意外情況的時候能夠重新啟動並恢復被破壞的 opcode。參考本人此篇 PHP-FPM進程池探秘 。
  • 數據類型:PHP 支持 9 種原始數據類型:
    四種標量類型:
    1. boolean(布爾型)
    2. integer(整型)
    3. float(浮點型,也稱作 double)
    4. string(字元串)
    
    三種複合類型:
    1. array(數組)
    2. object(對象)
    3. callable(可調用)
    
    最後是兩種特殊類型:
    1. resource(資源)
    2. NULL(無類型)
  • Lambda表達式(匿名函數)與閉包:Lambda表達式(匿名函數)實現了一次執行且無污染的函數定義,是拋棄型函數並且不維護任何類型的狀態。閉包在匿名函數的基礎上增加了與外部環境的變數交互,通過 use 子句中指定要導入的外部環境變數
    function getClosure($n)
    {
          $a = 100;
          return function($m) use ($n, &$a) { 
                $a += $n + $m;
                echo $a."\n";
            };
    }
    $fn = getClosure(1);
    $fn(1);//102
    $fn(2);//105
    $fn(3);//109
    echo $a;//Notice: Undefined variable
    class Dog
    {
        private $_name;
        protected $_color;
     
        public function __construct($name, $color)
        {
             $this->_name = $name;
             $this->_color = $color;
        }
     
        public function greet($greeting)
        {
             return function() use ($greeting) {
                //類中閉包可通過 $this 變數導入對象
                echo "$greeting, I am a {$this->_color} dog named {$this->_name}.\n";
             };
        }
        
        public function swim()
         {
             return static function() { 
                //類中靜態閉包不可通過 $this 變數導入對象,由於無需將對象導入閉包中,
    //因此可以節省大量記憶體,尤其是在擁有許多不需要此功能的閉包時。
    echo "swimming....\n"; }; } private function privateMethod() { echo "You have accessed to {$this->_name}'s privateMethod().\n"; } public function __invoke() { //此方法允許對象本身被調用為閉包 echo "I am a dog!\n"; } } $dog = new Dog("Rover","red"); $dog->greet("Hello")(); $dog->swim()(); $dog(); //通過ReflectionClass、ReflectionMethod來動態創建閉包,並實現直接調用非公開方法。 $class = new ReflectionClass('Dog'); $closure = $class->getMethod('privateMethod')->getClosure($dog); $closure(); 
  • 單/雙引號、Heredoc、Nowdoc:單引號字元串中只需要轉義單引號(\')、反斜杠(\\),其餘原樣輸出;雙引號字元串中的變數將被解析;Heredoc 結構類似於雙引號字元串;Nowdoc類似於單引號字元串,nowdoc 結構和 heredocs 結構使用一樣的標記 <<<, 但是跟在後面的標識符要用單引號括起來,即 <<<'EOT'
  • 字串變數解析:可分為$解析和{}解析。$解析就是解析出$引出的有效變數,{}解析則是解析{}中引出的變數
  • SQL註入風險:以下為列舉部分
    1. addslashes函數轉義風險:對於URL參數arg = %df\'在經過addslashes轉義後在GBK編碼下arg = 運'
    2. urldecode函數解碼風險:對於URL參數uid = 1%2527在調用urldecode函數解碼(二次解碼)後將變成uid = 1'
  • 大小寫轉換
    $str = preg_replace_callback(
        '/([a-z]*)([A-Z]*)/', 
        function($matchs){
            return strtoupper($matchs[1]).strtolower($matchs[2]);
        }, 
        $str
    );
  • 二進位安全:C字元串以空字元('\0')為結束標誌,這使得C字元串不能保存像圖片、音頻、視頻、壓縮文件這樣的二進位數據,反之則稱作二進位安全的。這個概念在PHP中經常提到,此處只做個簡單解釋。下麵是Redis 簡單動態字元串(SDS)的實現,它是二進位安全的:
    // 文件路徑:src/sds.h
    struct sdshdr {
        // 記錄buf數組中已使用位元組的數量
        int len;
        
        // 記錄buf數組中未使用位元組的數量
        int free;
        
        // 位元組數組,用於保存字元串
        char buf[];
    };
  • / 和 % 以及 ** 運算符:取模運算符%的操作數在運算之前都會轉換成整數(除去小數部分),取模運算符%的結果和被除數的符號(正負號)相同,** 表示乘方運算
    5 / 3;//1.6666666666667
    5.7 % 3;//2
    5 % 3;//2
    2 ** 3;//8
  • 運算符優先順序:優先順序從上到下依次降低
    結合方向運算符附加信息
    clone new clone 和 new
    [ array()
    ** 算術運算符
    ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 類型和遞增/遞減
    instanceof 類型
    ! 邏輯運算符
    * / % 算術運算符
    + - . 算術運算符和字元串運算符
    << >> 位運算符
    < <= > >= 比較運算符
    == != === !== <> <=> 比較運算符
    & 位運算符和引用
    ^ 位運算符
    | 位運算符
    && 邏輯運算符
    || 邏輯運算符
    ?? 比較運算符
    ? : ternary
    = += -= *= **= /= .= %= &= |= ^= <<= >>= 賦值運算符
    and 邏輯運算符
    xor 邏輯運算符
    or 邏輯運算符
  • unset() 與 NULL:刪除引用,觸發相應變數容器refcount減一,但在函數中的行為會依賴於想要銷毀的變數的類型而有所不同,比如unset 一個全局變數,則只是局部變數被銷毀,而在調用環境中的變數(包括函數參數引用傳遞的變數)將保持調用 unset 之前一樣的值;unset 變數與給變數賦值NULL不同,變數賦值NULL直接對相應變數容器refcount = 0
    //示例一:函數內銷毀全局變數$foo是無效的
    function destroy_foo() {
        global $foo;
        unset($foo);
        echo $foo;//Notice: Undefined variable: foo
    }
    
    $foo = 'bar';
    destroy_foo();
    echo $foo;//bar
    
    //示例二:要在函數中 unset 一個全局變數,應使用 $GLOBALS 數組來實現
    function foo() 
    {
        unset($GLOBALS['bar']);
    }
    
    $bar = "something";
    foo();
    echo $bar;//Notice: Undefined variable: bar
  • pack()與unpack():這兩個函數可用作socket編程時的二進位串編碼/解碼函數
    $binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);//Pack data into binary string
    $array = unpack("c4chars/nint", $binarydata);//Unpack data from binary string
    print_r($array);//Array ( [chars1] => 19 [chars2] => 52 [chars3] => 24 [chars4] => 22 [int] => 16706 )
  • PHP7 - Group Use用法

    // Proposed group use syntax:
     
    use FooLibrary\Bar\Baz\{ ClassA, ClassB, ClassC, ClassD as Fizbo };
     
    // Compared to current use syntax:
     
    use FooLibrary\Bar\Baz\ClassA;
    use FooLibrary\Bar\Baz\ClassB;
    use FooLibrary\Bar\Baz\ClassC;
    use FooLibrary\Bar\Baz\ClassD as Fizbo;
  • PHP7 - NULL合併運算符(??)
    // Fetches the request parameter user and results in 'nobody' if it doesn't exist
    $username = $_GET['user'] ?? 'nobody';
    // equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
  • PHP7 - 合併比較運算符(<=>)
    operator<=> equivalent
    $a < $b ($a <=> $b) === -1
    $a <= $b ($a <=> $b) === -1 || ($a <=> $b) === 0
    $a == $b ($a <=> $b) === 0
    $a != $b ($a <=> $b) !== 0
    $a >= $b ($a <=> $b) === 1 || ($a <=> $b) === 0
    $a > $b ($a <=> $b) === 1
  • PHP7 - 用戶層隨機數生成器:更安全方便
    1. random_bytes(int length):Generates cryptographically secure pseudo-random bytes, such as when generating salts, keys or initialization vectors.
     
    2. random_int(int min, int max):Generates cryptographically secure pseudo-random integers, such as when shuffling a deck of cards for a poker game.
    $bytes = random_bytes(5);
    var_dump(bin2hex($bytes));//string(10) "385e33f741"
    var_dump(random_int(100, 999));//int(248)
  • PHP7 - declare(strict_type=1):PHP7新增int、float、string和bool這4種標量類型聲明,declare(strict_type=1)將使PHP不在自動對數據類型進行轉換,PHP因此而成為了強類型語言。declare(strict_type=1)必須是文件的第一個語句,隻影響當前文件內的全部函數調用,不會影響被它包含(通過include等方式)進來的其他文件。

  • PHP7 - 可捕獲的Error:PHP7實現了一個全局的throwable介面,原來的Exception和部分Error都實現了這個介面。PHP7中有更多的Error變為可捕獲的Exception返回給開發者,如果不進行捕獲則為Error。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今年Python突然變得很火,據說入門也簡單,耐不住好奇,開始了我的Python之路,在學習Python之前,我只有簡單的Java基礎,沒有其他的編程經驗,而且以前也沒寫過博客,如果在文中有任何錯誤或者不足的地方,希望諸位嘴下留情,給予指點,現在給自己定的小目標是寫一個爬蟲出來,。Go on,開始踏 ...
  • 1、for迴圈套for迴圈,外面for每執行一次,裡面for執行10次,直到外面for執行完10次為止 運行結果: 2、外面1-for執行10次(0~9),2-for大於5退出迴圈 ...
  • 設置調整mq_queue的size*num如果大於預設(POSIX message queues),則需要調整系統限制和用戶限制,不然在mq_open是會報"Too many open files"的錯誤 1. man mq_overview命令可以瞭解到mq可以設置msg_max和msgsize_ ...
  • 1.在PHP開發種在很多的地方要涉及到數據類型的轉換,尤其是涉及到金額的數據類型,一定要轉換成float類型,否則在入庫的時候可能會因為數據類型的不同覆蓋掉之前的金額。(字元串和float類型相加) 2.數據類型的強制轉換:強制轉換成float類型。 ...
  • maven repository :maven的依賴查詢Alt+回車 導入包,自動修正Ctrl+N 查找類Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代碼Ctrl+Alt+O 優化導入的類和包Alt+Insert 生成代碼(如get,set方法,構造函數等)Ctrl+E或者Alt+ ...
  • 昨天發佈了 Hibernate 學習筆記第一篇後,今天第二篇來襲~ 此篇筆記是 Hibernate 學習的重點和難點,包括 Hibernate 中的映射關聯關係、Hibernate 的檢索策略與檢索方式(HQL、QBC)、Hibernate 的二級緩存,還包括管理 Session ,如何使 Sess... ...
  • 分類 功能點 Eclipse快捷鍵 IDEA快捷鍵 搜索 搜索文本 Ctrl + F Ctrl + F Ctrl + R 查找替換 Alt + P/A 逐個/全部替換 Alt + F3 查找當前選中詞 繼續搜索 Ctrl + K 向前 Ctrl + Shift + K 向後 F3 Shift + F ...
  • 參考鏈接:http://www.python(tab).com/html/2017/pythonhexinbiancheng_0904/1170.html(去除括弧) http://blog.csdn.net/eastmount/article/details/51082253 首先本文參考了上述兩 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...