[TOC]
## **echo、print、print_r、var_dump 區別**
`echo`和`print`是語言結構、`print_r`和`var_dump`是普通函數。
* **echo**:輸出一個或多個字符串
* **print**:輸出字符串
* **print_r**:打印關于變量的易于理解的信息
* **var_dump**:打印關于變量的易于理解的信息(帶類型)
## **單引號和雙引號的區別**
雙引號可以被分析器解析,單引號不行。
## **isset 和 empty 的區別**
* **isset**:檢測變量是否已設置并且不為 Null
* **empty**:判斷變量是否為空。
以下全部認為是空的:
* "" (空字符串)
* 0 (作為整數的0)
* 0.0 (作為浮點數的0)
* "0" (作為字符串的0)
* null
* false
* array() (一個空數組)
* $var; (一個聲明了,但是沒有值的變量)
## **static、self、$this的區別**
* static:可以用于靜態或者非靜態方法中,也可以訪問類的靜態屬性,靜態方法,常量和非靜態方法,但不能訪問非靜態屬性
* self:可以用于訪問類的靜態屬性,靜態方法和常量,但self 指向的是當前定義所在的類,這是 self 的限制。
* $this:指向的是實際調用時的對象。實際運行過程中,誰調用了類的屬性或方法,$this 指向哪個對象。但 $this 不能訪問類的靜態屬性和常量,且 $this 不能存在于靜態方法中
## **include、require、include_once、require_once 的區別**
`include` 表達式包含并運行指定文件。
`require` 和 `include` 幾乎完全一樣,除了處理失敗的方式不同。
`require` 在出錯是產生 **E_COMPILE_ERROR** 級別的錯誤,將導致腳本終止。`include`產生警告(**E_WARNIMG**),腳本繼續運行。
`include_once` 和 `include` 語句類似,唯一區別是如果該文件中已經被包含過,則不會再次包含,且 `include_once` 會返回 true。 顧名思義,`require_once`,文件僅僅包含(`require`)一次。
## **Cookie 和 Session**
Cookie:PHP 透明的支持 HTTP cookie。 cookie 是一種遠程瀏覽器端存儲數據并以此來跟蹤和識別用戶的機制
Session:會話機制(session)在 PHP 中用于保持用戶連續訪問web應用時的相關數據
## **魔術方法**
* `__construct()` - 在每次創建新對象時先調用此方法
* `__destruct()` - 在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行
* `__call()` - 在對象中調用一個不可訪問方法時被調用
* `__callStatic()` - 在靜態上下文中調用一個不可訪問方法時被調用
* `__get()` - 讀取不可訪問(protected 或 private)或不存在的屬性的值時被調用
* `__set()` - 在給不可訪問(protected 或 private)或不存在的屬性賦值時被調用
* `__isset()` - 當對不可訪問(protected 或 private)或不存在的屬性調用 `isset()` 或 `empty()` 時被調用
* ` __unset()` - 當對不可訪問(protected 或 private)或不存在的屬性調用 `unset()` 時被調用
* `__sleep()` - `serialize() `函數會檢查類中是否存在一個魔術方法 `__sleep()`。如果存在,該方法會先被調用
* `__wakeup()` - `unserialize()` 會檢查是否存在一個 `__wakeup()` 方法。如果存在,該方法會先被調用
* `__toString()` - 一個類被當成字符串時的回應
* `__invoke() ` - 當嘗試以調用函數的方式調用一個對象時被調用
> 除了 `__construct()`, `__destruct()` ,和 `__clone()` 之外的所有魔術方法都 必須 聲明為 **public**, 否則會發出 **E_WARNING**
## **public、protected、private、final 區別**
對屬性或方法的訪問控制,是通過在前面添加關鍵字 **public(公有)**,**protected(受保護)**或 **private(私有)**來實現的。被定義為公有的類成員可以在任何地方被訪問。
PHP 5 新增了一個 **final** 關鍵字。**如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承**
## **類的靜態調用和實例化調用**
* 占用內存
靜態方法在內存中只有一份,無論調用多少次,都是共用的
實例化不一樣,每一個實例化是一個對象,在內存中是多個的
* 不同點
靜態調用不需要實例化即可調用
靜態方法不能調用非靜態屬性,因為非靜態屬性需要實例化后,存放在對象里
靜態方法可以調用非靜態方法,使用 `self `關鍵字。**php 里,一個方法被 `self::` 后,自動轉變為靜態方法**
調用類的靜態函數時不會自動調用類的構造函數
## **接口和抽象的區別**
抽象用于描述不同的事物,接口用于描述事物的行為。
## **PHP 與 MySQL 連接的幾種方式**
### **MySQLi**
```php
// 創建一個連接誒
$conn = new mysqli('127.0.0.1:3306', 'root', '123456');
// 檢查連接
if ($conn->connect_errno) {
die($conn->connect_error . "\n");
}
$conn->query("set names 'utf8';");
// 選擇用于數據庫查詢的默認數據庫
$select_db = $conn->select_db('user');
if (!$select_db) {
die($conn->error . "\n");
}
// 執行查詢
$sql = "SELECT * FROM `user` LIMIT 1";
$res = $conn->query($sql);
if (!$res) {
die($conn->error . "\n");
}
while ($row = $res->fetch_assoc()) {
var_dump($row);
}
$res->free();
// 關閉連接
$conn->close();
```
### **PDO**
```php
$pdo = new PDO('mysql:host=127.0.0.1:3306;dbname=user', 'root', '123456');
$pdo->exec("set names 'utf8'");
$sql = "SELECT * FROM `user` LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 1, PDO::PARAM_STR);
$rs = $stmt->execute();
if ($rs) {
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
var_dump($row);
}
}
$pdo = null;
```
### **MySQLi、PDO 區別**
1. **連接**
~~~php
// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');
// mysqli, procedural way
$mysqli = mysqli_connect('localhost','username','password','database');
// mysqli, object oriented way
$mysqli = new mysqli('localhost','username','password','database');
~~~
2. **API支持**
PDO 和 MySQL i都是通過面向對象的形式提供 API,但是同時**MySQLi也提供了面向過程的API**,這種形式對于新手來說更容易理解
3. **數據塊支持**
PDO比MySQLi最大的優點就是**PDO支持很多種數據庫**,而MySQLi只支持MySQLi。
4. **命名參數支持**
* PDO 參數綁定
~~~php
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
$pdo->prepare('
SELECT * FROM users
WHERE username = :username
AND email = :email
AND last_login > :last_login');
$pdo->execute($params);
~~~
* MySQLi 參數綁定
~~~
$query = $mysqli->prepare('
SELECT * FROM users
WHERE username = ?
AND email = ?
AND last_login > ?');
$query->bind_param('sss', 'test', $mail, time() - 3600);
$query->execute();
~~~
PDO是通過命名參數進行值的綁定,而MySQLi的參數綁定是通過點位符“?”并嚴格按這個問號的順序來綁定值。
5. **對象映射(Object Mapping)**
基于數據庫的開發一般都是從數據庫中讀取數據然后把這些數據用一個對象來承載。**PDO和MySQLi都支持對象映射**
6. **安全性**
二者**都可以防止sql注入**
7. **性能**
由于PDO能夠支持其它非MySQL的數據庫,而MySQLi專門針對MySQL設計的,所以MySQLi相對于PDO性能稍微好一些。
## **PHP 代碼執行過程**
PHP 代碼 => 啟動 php 及 Zend 引擎,加載注冊拓展模塊 => 對代碼進行詞法/語法分析 => 編譯成opcode(opcache) => 執行 opcode
## **主流 PHP 框架特點**
### Laravel
易于訪問,功能強大,并提供大型,強大的應用程序所需的工具
- 簡單快速的路由引擎
- 強大的依賴注入容器
- 富有表現力,直觀的數據庫 ORM
- 提供數據庫遷移功能
- 靈活的任務調度器
- 實時事件廣播
### ThinkPHP
- 采用容器統一管理對象
- 支持 Facade
- 更易用的路由
- 注解路由支持
- 路由跨域請求支持
- 驗證類增強
- 配置和路由目錄獨立
- 取消系統常量
- 類庫別名機制
- 模型和數據庫增強
- 依賴注入完善
- 支持 PSR-3 日志規范
- 中間件支持
- 支持 Swoole/Workerman 運行
## **串行、并行、并發的區別**
* **串行**:執行多個任務時,各個任務按順序執行,完成一個之后才能進行下一個
* **并行**:多個任務在同一時刻執行
* **并發**:同一時刻需要執行多個任務
- https://github.com/colinlet/PHP-Interview-QA#php-%E7%AF%87
- http://www.hmoore.net/martist/be_new_friends/1704834
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS