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