[[官方手冊]](http://php.net/manual/zh/index.php)
[TOC]
## 簡介
### PHP特點
PHP:Hypertext Preprocessor,超文本預處理器。
* 是一種腳本語言。由Web服務器中安裝的PHP應用模塊解析。融合了現代編程語言(C,Java和Perl)的一些最佳特性。
* 運行在服務器端。只會在服務器端運行,不會傳到客戶端。PHP根據不同用戶的不同請求,完成在服務器中的業務操作,并將結果返回給用戶。
* 嵌入到HTML中。通過特殊的標識符號嵌入到HTML代碼中。嵌入的這些PHP代碼需要先在服務器中運行完成,若有輸出則將輸出結果字符串嵌入原來的PHP代碼處,再和HTML代碼一起響應給客戶端的瀏覽器進行解析。
**腳本語言**:又稱為動態語言,是使用一種特定的描述性語言、依據一定格式編寫的可執行文件。腳本是一種純文本(如ASCII碼)保存的程序,只在被調用時進行解釋或編譯。腳本在執行時,是由系統的腳本解釋器,將腳本中的文字命令一條一條翻譯成機器可識別的指令,并按腳本中的順序執行。
### PHP應用
PHP是用來協助Web服務器工作的編程語言,是對Web服務器功能的擴展,外掛在Web服務器上一起工作,需要安裝PHP應用程序服務器對PHP腳本進行解釋執行。
1. 收集表單(Form)數據。$_GET,$_POST。
2. 生成動態網頁。根據用戶在客戶端的不同輸入請求,服務器端的PHP腳本程序可動態輸出內容返回給客戶端,但客戶端無法得知具體的處理過程/代碼。
3. 字符串處理。字符串是PHP的一種基本數據類型。PHP中有豐富的字符串處理函數,還可以使用正則表達式對字符串和文本進行搜索、查找、匹配、替換等操作。
4. 動態輸出圖像。PHP通過使用GD擴展庫可用于動態輸出圖像(文字按鈕、驗證碼、數據統計圖等),還可編輯圖像(處理縮略圖、為圖片添加水印等)。
5. 處理服務器端文件系統。PHP可利用文件系統函數任意操作服務器中的目錄和文件(打開、編輯、復制、創建、刪除,文件屬性等)。
6. 編寫數據庫支持的網頁。PHP可以連接所有主流的數據庫,MySQL、Oracle、SQL Server、MangoDB等。
7. 會話跟蹤控制。$_SESSION、$_COOKIE。
8. 處理XML文件。PHP 5基于libxm2標準化所有的XML擴展,并添加了SimpleXML和XMLReader支持。
9. 支持利用大量的網絡協議。LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 環境)等。PHP已經支持對Java對象的即時連接,并可以將他們自由地用做PHP對象。甚至可以用CORBA擴展庫來訪問遠程對象。
10. 服務器端的其他操作。PHP在電子商務領域,其Cybercash支付、CyberMUT、VeriSign Payflow Pro及MCVE函數對于在線交易程序來說非常有用。還有很多其他的擴展庫:mnoGoSearch搜索引擎函數、IRC網關函數、壓縮工具(gzip、bz2)、日歷轉換、翻譯等等。
11. 應用于所有主流操作系統。Windows、Linux、iOS、RISC OS等。
12. 支持大多數Web服務器。Apache、Nginx、TomCat、IIS、PWS(Personal Web Server)、Netscape等。對于大多數服務器,PHP提供了一個模塊。(Web服務器安裝成功后,可在php腳本中應用“phpinfo()”函數查看PHP模塊的情況)
13. 支持面向過程和面向對象的開發。
## 0. 命名空間
在全局命名空間中選擇創建的符號名稱時,要考慮到以下指導方針以免未來的 PHP 版本破壞掉用戶使用的符號名稱。
### 0.1 全局命名空間
以下代碼結構會進入全局命名空間:
* functions(函數)
* classes(類)
* interfaces(接口)
* constants(常量,并非類常量)
* 在函數/方法之外定義的變量
### 0.2 規則
以下列表指出了 PHP 工程在選擇新的內部標識符時保留給自己的權利。最終指南是官方的[? 編碼標準:](http://git.php.net/?p=php-src.git;a=blob_plain;f=CODING_STANDARDS;hb=HEAD)
* PHP 擁有最頂層命名空間,但是會嘗試找到合體的描述命名以避免任何明顯的沖突。
* 函數名在兩個詞中間使用下劃線,類名則同時使用 camelCase 和 PascalCase 規則。
* PHP 在任何擴展庫的全局符號前附加上擴展庫的名稱(此規則在過去則有無數例外)。例如:
- curl_close()
- mysql_query()
- PREG_SPLIT_DELIM_CAPTURE
- new DOMDocument()
- new SplFileObject()
- Iterators 和 Exceptions 則只是簡單加上 "Iterator" 和 "Exception" 后綴。例如:
- ArrayIterator
- LogicException
- PHP 保留所有以` __ `開頭的符號(雙下劃線)作為魔術符號。建議用戶不要在 PHP 中創建以` __ `打頭的符號,除非是要使用有文檔記載的魔術函數功能。例如:
- __get()
- __autoload()
### 0.3 提示
要寫出能經受住時間考驗的代碼,建議給任何進入全局命名空間的符號都加上一個不常見的 3-4 字母的前綴(或后綴),中間用下劃線分開。為了避免與其它用戶空間代碼出現命名空間沖突,建議先研究一下其它項目中已有的前綴(或后綴)并適當地公布出來。示例如下:
- MyPx_someFunc()
- Foo_Date
- $asdf_dbh
## 2. 時間戳
### 2.1
### 2.2
## 3. JSON
### 3.1
### 3.2
## 4. PDO
### 4.1
### 4.2
## 5. 全局變量
### 5.1 $_SERVER,服務器變量
### 5.2 $_ENV,環境變量
PHP中的`$_ENV`是一個包含服務器端環境變量的數組。它是PHP中一個超級全局變量,我們可以在PHP 程序的任何地方直接訪問它。
`$_ENV`只是被動的接受服務器端的環境變量并把它們轉換為數組元素,你可以嘗試直接輸出它。
當你想看看一個變量中究竟有什么東西在里面時,可以有三種方式:
~~~php
1、var_dump($_ENV);
2、print_r($_ENV);
3、foreach($_ENV as $key=>$val){echo $key.'--------'.$val.'<br>';}
~~~
第一種最方便而且輸出的內容格式清晰。
由于`$_ENV`變量是取決于服務器的環境變量的,從不同的服務器上獲取的`$_ENV`變量打印出的結果可能是完全不同的。所以無法像`$_SERVER`那樣列出完整的列表。以下是`$_ENV`數組包含的比較通用的元素:
有時候,`$_ENV`會為空,其原因通常是php的配置文件php.ini的配置項為:`variables_order = "GPCS"`。要想讓`$_ENV`的值不為空,那么variables_order的值應該加上一個大寫字母“E”,即:`variables_order = "EGPCS"`。
上述配置表示了PHP接受的外部變量來源及順序,`EGPCS`是Environment、Get、Post、Cookies、Server的縮寫。如果variables_order 的配置中缺少E ,則PHP 無法接受環境變量,那么`$_ENV` 也就為空了。
由于開啟`$_ENV`,即variables_order = "EGPCS"會導致一些性能損失,按php官方的說法是,在生產環境中,不推薦使用。他們更推薦使用`getenv (string $varname)`函數來獲取Environment中的值,而這點需要在編程時就注意到。如果編程時用了$_ENV而variables_order中又沒有配置為variables_order = "EGPCS",則程序運行時可能會報錯。
### 5.3 $_GET,URL GET變量
### 5.4 $_POST,HTTP POST變量
### 5.5 $_REQUEST,request變量
### 5.6 $_FILES,HTTP文件上傳變量
### 5.7 $_COOKIE,HTTP Cookie
### 5.8 $_SESSION,HTTP Sesssion變量
### 5.9 $GLOBALS,Global變量
## 6. 類與對象
[參考文檔,http://php.net/manual/zh/oop5.intro.php](http://php.net/manual/zh/oop5.intro.php)
PHP 5 具有完整的對象模型。
PHP 5 中的新特性包括訪問控制,抽象類和 final 類與方法,附加的魔術方法,接口,對象復制和類型約束。
PHP 對待對象的方式與引用和句柄相同,即每個變量都持有對象的引用,而不是整個對象的拷貝。
### 6.1 類的定義(class)
每個類的定義都以關鍵字 `class` 開頭,后面跟著類名,后面跟著一對花括號,里面包含有類的屬性與方法的定義。
Example #1 簡單的類定義
~~~php
<?php
class SimpleClass
{
// property declaration
public $var = 'a default value';
// method declaration
public function displayVar() {
echo $this->var;
}
}
?>
~~~
一個類可以包含有屬于自己的常量,變量(稱為“屬性”)以及函數(稱為“方法”)。
當一個方法在類定義內部被調用時,有一個可用的偽變量` $this`。`$this` 是一個到主叫對象的引用(通常是該方法所從屬的對象,但如果是從第二個對象靜態調用時也可能是另一個對象)。
### 6.2 類的實例化(new)
要創建一個類的實例,必須使用 `new `關鍵字。當創建新對象時該對象總是被賦值,除非該對象定義了構造函數并且在出錯時拋出了一個異常。類應在被實例化之前定義(某些情況下則必須這樣)。
在類定義內部,可以使用 `new self` 和 `new parent` 創建新對象。
PHP 5.3.0 引進了兩個新方法來創建一個對象的實例:
code:
~~~php
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
~~~
以上例程會輸出:
~~~php
bool(true)
bool(true)
bool(true)
~~~
### 6.3 類的繼承(extends)
一個類可以在聲明中用 `extends` 關鍵字繼承另一個類的方法和屬性。PHP不支持多重繼承,一個類只能繼承一個基類。
被繼承的方法和屬性可以通過用同樣的名字重新聲明被覆蓋。但是如果父類定義方法時使用了 final,則該方法不可被覆蓋。可以通過 parent:: 來訪問被覆蓋的方法或屬性。
當覆蓋方法時,參數必須保持一致否則 PHP 將發出 E_STRICT 級別的錯誤信息。但構造函數例外,構造函數可在被覆蓋時使用不同的參數。
code簡單的類繼承
~~~php
<?php
class ExtendClass extends SimpleClass
{
// Redefine the parent method
function displayVar()
{
echo "Extending class\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
~~~
以上例程會輸出:
~~~php
Extending class
a default value
~~~
## x. 異步通信庫(Swoole)
### x.1 異步IO
### x.2 webSocket
## [參考資源]
### 官方
#### [函數參考](http://php.net/manual/zh/funcref.php)
#### [字符串 函數](http://php.net/manual/zh/ref.strings.php)
#### [日期與時間相關擴展](http://php.net/manual/zh/refs.calendar.php)
#### [數組](http://php.net/manual/zh/book.array.php)
#### [類與對象](http://php.net/manual/zh/language.oop5.php)
- WebAPP
- Linux Command
- 入門
- 處理文件
- 查找文件單詞
- 環境
- 聯網
- Linux
- Linux目錄配置標準:FHS
- Linux文件與目錄管理
- Linux賬號管理與ACL權限設置
- Linux系統資源查看
- 軟件包管理
- Bash
- Daemon/Systemd
- ftp
- Apache
- MySQL
- Command
- Replication
- mysqld
- remote access
- remark
- 限制
- PHP
- String
- Array
- Function
- Class
- File
- JAVA
- Protocals
- http
- mqtt
- IDE
- phpDesigner
- eclipse
- vscode
- Notepad++
- WebAPI
- Javasript
- DOM
- BOM
- Event
- Class
- Module
- Ajax
- Fetch
- Promise
- async/await
- Statements and declarations
- Function
- Framwork
- jQurey
- Types
- Promise
- BootStrap
- v4
- ThinkPHP5
- install
- 定時任務
- CodeIgniter
- React.js
- node.js
- npm
- npm-commands
- npm-folder
- package.json
- Docker and private modules
- module
- webpack.js
- install
- configuration
- package.json
- entry
- modules
- plugins
- Code Splitting
- loaders
- libs
- API
- webpack-cli
- Vue.js
- install
- Compile
- VueAPI
- vuex
- vue-router
- vue-devtools
- vue-cli
- vue-loader
- VDOM
- vue-instance
- components
- template
- Single-File Components
- props
- data
- methods
- computed
- watch
- Event-handling
- Render Func
- remark
- 案例學習
- bootstrap-vue
- modal
- fontAwesome
- Hosting Font Awesome Yourself
- using with jquery
- using with Vue.js
- HTML
- CSS
- plugins
- Chart.js
- D3.js
- phpSpreadSheet
- Guzzle
- Cmder
- Git
- git命令
- git流程
- Postman
- Markdown
- Regular Expressions
- PowerDesigner
- 附錄1-學習資源