摘要:通過注冊自動加載器,腳本引擎在出錯失敗前有了最后一個機會加載所需的類構造函數和析構函數構造函數允行開發者在一個類中定義一個方法作為構造函數。析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行抽象類支持抽象類和抽象方法。
語言參考 1. 類型 1.1 簡介 1.2 Float 浮點型
浮點數的精度有限1.3 String 字符串例如,floor((0.1+0.7) * 10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999999991118...
string 最大可以達到 2GB
一個字符串可以用 4 種方式表達
單引號
雙引號
heredoc 語法結構
nowdoc 語法結構
1.4 Array 數組PHP 中的數組實際上是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型在很多方面做了優化,因此可以把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。由于數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的1.5 Resource 資源類型
資源 resource 是一種特殊變量,保存了到外部資源的一個引用。資源是通過專門的函數來建立和使用的
釋放資源
引用計數系統是 Zend 引擎的一部分,可以自動檢測到一個資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會被垃圾回收系統釋放。因此,很少需要手工釋放內存1.6 NULL
特殊的 NULL 值表示一個變量沒有值。NULL 類型唯一可能的值就是 NULL。
在下列情況下一個變量被認為是 NULL
被賦值為 NULL
尚未被賦值
被 unset()
1.7 偽類型偽類型(pseudo-types) 是 PHP 文檔里用于指示參數可以使用的類型和值。 請注意,它們不是 PHP 語言里原生類型。 所以不能把偽類型用于自定義函數里的類型約束(typehint)2. 變量 2.1 變量范圍
變量的范圍即它定義的上下文背景(也就是它的生效范圍)。大部分的 PHP 變量只有一個多帶帶的范圍。這個多帶帶的范圍跨度同樣包含了 include 和 require 引入的文件2.2 可變變量這里變量 $a 將會在包含文件 b.inc 中生效。但是,在用戶自定義函數中,一個局部函數范圍將被引入。任何用于函數內部的變量按缺省情況將被限制在局部函數范圍內
$a = "hello"; $$a = "world"; echo "$a ${$a}";3. 常量 3.1 魔術常量
名稱 | 說明 |
---|---|
__LINE__ | 文件中的當前行號 |
__FILE__ | 文件的完整路徑和文件號 |
__DIR__ | 文件所在的目錄 |
__FUNCTION__ | 函數名稱 |
__CLASS__ | 類的名稱 |
__TRAIT__ | Trait的名字 |
__METHOD__ | 類的方法名 |
__NAMESPACE__ | 當前命名空間的名稱(區分大小寫) |
//乘方 $a = 3; $b = 2; echo $a ** $b;4.2 位運算符
位運算符允許對整型數中指定的位進行求值和操作
例子 | 名稱 | 結果 |
---|---|---|
$a & $b | And(按位與) | 將把 $a 和 $b 中都為 1 的位設為 1 |
$a 豎線(注1) $b | Or(按位或) | 將把 $a 和 $b 中任何一個為 1 的位設為 1 |
$a ^ $b | Xor(按位異或) | 將把 $a 和 $b 中一個為 1 另一個為 0 的位設為 1 |
~ $a | Not(按位取反) | 將 $a 中為 0 的位設為 1,反之亦然 |
$a << $b | Shift left(左移) | 將 $a 中的位向左移動 $b 次(每一次移動都表示“乘以 2”) |
$a >> $b | Shift right(右移) | 將 $a 中的位向右移動 $b 次(每一次移動都表示“除以 2”) |
注1:這里“豎線”豎線是“|”,這里 markdown 支持好像有點問題4.3 比較運算符
比較運算符,如同它們名稱所暗示的,允許對兩個值進行比較
例子 | 名稱 | 結果 |
---|---|---|
$a == $b | 等于 | TRUE,如果類型轉換后 $a 等于 $b |
$a === $b | 全等 | TRUE,如果 $a 等于 $b,并且它們的類型也相同 |
$a != $b | 不等 | TRUE,如果類型轉換后 $a 不等于 $b |
$a <> $b | 不等 | TRUE,如果類型轉換后 $a 不等于 $b |
$a !== $b | 不全等 | TRUE,如果 $a 不等于 $b,或者它們的類型不同 |
$a < $b | 小與 | TRUE,如果 $a 嚴格小于 $b |
$a > $b | 大于 | TRUE,如果 $a 嚴格大于 $b |
$a <= $b | 小于等于 | TRUE,如果 $a 小于或者等于 $b |
$a >= $b | 大于等于 | TRUE,如果 $a 大于或者等于 $b |
$a <=> $b | 太空船運算符(組合比較符) | 當$a小于、等于、大于$b時 分別返回一個小于、等于、大于0的integer 值。 PHP7開始提供. |
$a ?? $b ?? $c | NULL 合并操作符 | 從左往右第一個存在且不為 NULL 的操作數。如果都沒有定義且不為 NULL,則返回 NULL。PHP7開始提供 |
PHP 支持一個執行運算符:反引號(``)。注意這不是單引號!PHP 將嘗試將反引號中的內容作為 shell 命令來執行,并將其輸出信息返回(即,可以賦給一個變量而不是簡單地丟棄到標準輸出)。使用反引號運算符“`”的效果與函數 shell_exec() 相同4.5 數組運算符
例子 | 名稱 | 結果 |
---|---|---|
$a + $b | 聯合 | $a 和 $b 的聯合 |
$a == $b | 相等 | 如果 $a 和 $b 具有相同的鍵/值對則為 TRUE |
$a === $b | 全等 | 如果 $a 和 $b 具有相同的鍵/值對并且順序和類型都相同則為 TRUE |
$a != $b | 不等 | 如果 $a 不等于 $b 則為 TRUE |
$a <> $b | 不等 | 如果 $a 不等于 $b 則為 TRUE |
$a !== $b | 不全等 | 如果 $a 不全等于 $b 則為 TRUE |
instanceof 用于確定一個 PHP 變量是否屬于某一類 class 的實例5. 流程控制 5.1 流程控制的替代語法instanceof 也可用來確定一個變量是不是繼承自某一父類的子類的實例
instanceof 也可用于確定一個變量是不是實現了某個接口的對象的實例
PHP 提供了一些流程控制的替代語法,包括 if,while,for,foreach 和 switch。替代語法的基本形式是把左花括號({)換成冒號(:),把右花括號(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;
if (true) : echo "run "; endif;5.2 do-while 5.3 break
break 結束當前 for,foreach,while,do-while 或者 switch 結構的執行5.4 continuebreak 可以接受一個可選的數字參數來決定跳出幾重循環
continue 在循環結構用用來跳過本次循環中剩余的代碼并在條件求值為真時開始執行下一次循環5.5 declarecontinue 接受一個可選的數字參數來決定跳過幾重循環到循環結尾。默認值是 1,即跳到當前循環末尾
declare 結構用來設定一段代碼的執行指令
declare(ticks=1); // A function called on each tick event function tick_handler() { echo "tick_handler() called "; } register_tick_function("tick_handler"); $a = 1; if ($a > 0) { $a += 2; print($a); }5.6 require
require 和 include 幾乎完全一樣,除了處理失敗的方式不同之外。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。換句話說將導致腳本中止而 include 只產生警告(E_WARNING),腳本會繼續運行6. 函數 6.1 用戶自定義函數
當一個函數是有條件被定義時,必須在調用函數之前定義6.2 可變函數PHP 不支持函數重載,也不可能取消定義或者重定義已聲明的函數
但是要避免遞歸函數/方法調用超過 100-200 層,因為可能會使堆棧崩潰從而使當前腳本終止。 無限遞歸可視為編程錯誤
PHP 支持可變函數的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數,并且嘗試執行它。可變函數可以用來實現包括回調函數,函數表在內的一些用途
function foo() { echo "In foo()6.3 匿名函數
"; } $func = "foo"; $func(); // This calls foo()
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值
$greet = function($name) { printf("Hello %s ", $name); }; $greet("World"); $greet("PHP");7. 類與對象 7.1 基本概念
每個類的定義都以關鍵字 class 開頭,后面跟著類名,后面跟著一對花括號,里面包含有類的屬性與方法的定義7.2 類的自動加載一個類可以包含有屬于自己的常量,變量(稱為“屬性”)以及函數(稱為“方法”)
當一個方法在類定義內部被調用時,有一個可用的偽變量 $this
在編寫面向對象(OOP) 程序時,很多開發者為每個類新建一個 PHP 文件。 這會帶來一個煩惱:每個腳本的開頭,都需要包含(include)一個長長的列表(每個類都有個文件)在 PHP 5 中,已經不再需要這樣了。 spl_autoload_register() 函數可以注冊任意數量的自動加載器,當使用尚未被定義的類(class)和接口(interface)時自動去加載。通過注冊自動加載器,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類
spl_autoload_register(function ($class_name) { require_once $class_name . ".php"; }); $obj = new MyClass1(); $obj2 = new MyClass2();7.3 構造函數和析構函數
構造函數
PHP 5 允行開發者在一個類中定義一個方法作為構造函數。具有構造函數的類會在每次創建新對象時先調用此方法,所以非常適合在使用對象之前做一些初始化工作
析構函數
PHP 5 引入了析構函數的概念,這類似于其它面向對象的語言,如 C++。析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行7.4 抽象類
PHP 5 支持抽象類和抽象方法。定義為抽象的類不能被實例化。任何一個類,如果它里面至少有一個方法是被聲明為抽象的,那么這個類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現7.5 對象接口
使用接口(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的
接口中定義的所有方法都必須是公有,這是接口的特性
實現(implements)
要實現一個接口,使用 implements 操作符。類中必須實現接口中定義的所有方法,否則會報一個致命錯誤。類可以實現多個接口,用逗號來分隔多個接口的名稱7.6 Trait
自 PHP 5.4.0 起,PHP 實現了一種代碼復用的方法,稱為 trait7.7 匿名類 7.8 魔術方法Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method。Trait 和 Class 組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題
Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法通過 trait 自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() 等方法在 PHP 中被稱為"魔術方法"(Magic methods)7.9 Final 關鍵字
PHP 5 新增了一個 final 關鍵字。如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承8. 生成器 9. 預定義變量
名稱 | 用途 |
---|---|
超全局變量 | 超全局變量是在全部作用域中始終可用的內置變量 |
$GLOBALS | 引用全局作用域中可用的全部變量 |
$_SERVER | 服務器和執行環境信息 |
$_GET | HTTP GET 變量 |
$_POST | HTTP POST 變量 |
$_FILES | HTTP 文件上傳變量 |
$_REQUEST | HTTP Request 變量 |
$_SESSION | Session 變量 |
$_ENV | 環境變量 |
$_COOKIE | HTTP Cookies |
$php_errormsg | 前一個錯誤信息 |
$HTTP_RAW_POST_DATA | 原生POST數據 |
$http_response_header | HTTP 響應頭 |
$argc | 傳遞給腳本的參數數目 |
$argv | 傳遞給腳本的參數數組 |
結合實際 PHP 面試,系統的匯總面試中的各種各樣的問題,嘗試提供簡潔準確的答案。如果你在 PHP 面試中遇到問題,歡迎提 Issues 交流。包含網絡協議、數據結構與算法、PHP、Web、MySQL、Redis、Linux、安全、設計模式、架構、自我介紹、離職原因、職業規劃、準備問題等部分。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31085.html
摘要:手冊序言,即,是一種被廣泛應用的開源通用腳本語言,尤其適用于開發并可嵌入中去。該語言的主要目標是允許開發人員快速編寫動態生成的頁面,但的用途遠不只于此。對于服務器模塊版本的,僅在服務器啟動時讀取一次。 PHP手冊 序言 PHP,即PHP: Hypertext Preprocessor,是一種被廣泛應用的開源通用腳本語言,尤其適用于 Web 開發并可嵌入 HTML 中去。它的語法利用了 ...
摘要:字符串分解操作要進行分解的字符串分解的長度。獲取字符串的長度函數要進行長度計算的字符串包括首尾空格獲取字符串的子串要進行截取的字符串截取開始的字符位置可選,要截取的字符串長度。默認從開始到結尾,字符串的第一個位置為獲取字符串的子串 一 print和echo print 1)語法 int print(str);//str--要輸出的字符串,返回值永遠為1 --語法1 p...
摘要:如果是聲明中的第一個詞,那么就是一個函數聲明,否則就是一個函數表達式。給函數表達式指定一個函數名可以有效的解決以上問題。始終給函數表達式命名是一個最佳實踐。也有開發者干脆關閉了靜態檢查工具對重復變量名的檢查。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復雜微妙技術的語言,即使是經驗豐富的 Ja...
摘要:例如現在的入門學習手記系列。收到粉絲留言和打賞的喜悅。安裝上一篇入門學習手記一,主要是介紹了的核心概念,是整個學習過程的基礎知識。新生成的類似如下入門學習手記因為生成的內容過多,我直接省略掉了。 showImg(https://segmentfault.com/img/bVbk5Nd?w=1150&h=599); 本人微信公眾號:前端修煉之路,歡迎關注。 最近開始想要維護一個個人的公眾...
摘要:定場詩守法朝朝憂悶,強梁夜夜歡歌損人利己騎馬騾,正值公平挨餓修橋補路瞎眼,殺人放火兒多我到西天問我佛,佛說我也沒轍前言讀學習數據結構與算法第章數組,本小節將繼續為各位小伙伴分享數組的相關知識數組的新功能。 定場詩 守法朝朝憂悶,強梁夜夜歡歌; 損人利己騎馬騾,正值公平挨餓; 修橋補路瞎眼,殺人放火兒多; 我到西天問我佛,佛說:我也沒轍! 前言 讀《學習JavaScript數據結構與算法...
閱讀 1798·2021-11-24 10:21
閱讀 1208·2021-09-22 15:25
閱讀 3170·2019-08-30 15:55
閱讀 708·2019-08-30 15:54
閱讀 3461·2019-08-30 14:20
閱讀 1659·2019-08-30 14:06
閱讀 638·2019-08-30 13:11
閱讀 3144·2019-08-29 16:43