1995 年,丹麥人 Rasmus Lerdorf 發明 PHP ,採取接近 C 語言的語法,主要用於網站伺服器的應用,用來處理動態網頁。現在 PHP 由 PHP Group 和開放原始碼社群維護,廣泛用於網路程式的開發。
維基百科:https://en.wikipedia.org/wiki/PHP
PHP 是極少數單純為了網站開發而設計出來的程式語言,不過它的可用範圍也不再只限於網站,事實上,PHP 可以用來開發命令列或者 GUI 程式等。
PHP 最大的特色就是簡單易學,其動態語言特性讓初學者不用煩惱變數的型別,可以專注在學習邏輯的操作。而從 JAVA 借鑑過來的錯誤處理與各種語言特性也讓 PHP 適合用來編寫大型健壯的網頁應用程式。另一方面,PHP 非常快,其效能在動態語言中算是非常高的,尤其 PHP7 比前一版有了近一倍的效能提昇。
PHP 的使用族群非常多,大量的職缺不怕找不到工作。不過也因為使用人口龐大,相對素質低落的三角貓也不少,拉下了工程師的整體素質。且框架種類較多較繁雜,初學者也不容易了解每種框架的特性來選擇合適的學習方向。
知名使用者: Facebook, Yahoo
框架: Symfony, Zend, Laravel, Yii, Phalcon, CodeIgnitor, Slim, Joomla
圖表資料來源 ( 10 年漫長等待,PHP 7 終於問世):http://www.ithome.com.tw/news/101599
為什麼大型網站前端使用 PHP,後台邏輯用 Java:https://read01.com/Le66BM.html
PHP 線上教學:http://tianen.com/book/php/index.asp.htm
PHP 物件導向的第一課:class
http://ithelp.ithome.com.tw/articles/10114633
PHP 物件導向的第二課:重談「方法」,物件「屬性」及「成員」
http://ithelp.ithome.com.tw/articles/10114707
PHP 物件導向的第三課:建構式
http://ithelp.ithome.com.tw/articles/10114761
PHP 物件導向的第四課:繼承
http://ithelp.ithome.com.tw/articles/10114805
http://ithelp.ithome.com.tw/articles/10114871
PHP 物件導向的第五課:介面 & 虛擬類別
http://ithelp.ithome.com.tw/articles/10115273
為什麼大型網站前端使用 PHP,後台邏輯用 Java:https://read01.com/Le66BM.html
PHP 線上教學:http://tianen.com/book/php/index.asp.htm
PHP 物件導向的第一課:class
http://ithelp.ithome.com.tw/articles/10114633
PHP 物件導向的第二課:重談「方法」,物件「屬性」及「成員」
http://ithelp.ithome.com.tw/articles/10114707
PHP 物件導向的第三課:建構式
http://ithelp.ithome.com.tw/articles/10114761
PHP 物件導向的第四課:繼承
http://ithelp.ithome.com.tw/articles/10114805
http://ithelp.ithome.com.tw/articles/10114871
PHP 物件導向的第五課:介面 & 虛擬類別
http://ithelp.ithome.com.tw/articles/10115273
比較 PHP-MySQL 與 PDO (PHP Data Object) 的差異:https://blog.roga.tw/2010/06/2403
使用 Laravel 的優缺點:http://oomusou.io/laravel/laravel-for-newbie/
編寫 MVC 框架的案例:http://www.awaimai.com/128.html
PHP 不要結尾標籤:https://segmentfault.com/q/1010000000437998
官方手册上推荐的用法,手册上有详细说明:
如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。
如果使用闭合标签,任何由开发者,用户,或者 FTP 应用程序插入闭合标签后面的空格都有可能会引起多余的输出、php 错误、之后的输出无法显示、空白页。因此,所有的 php 文件应该省略这个 php 闭合标签,并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于确定这个文件已经结束而不是被删节的。
<?php
echo "Hello world";
// ... more code
echo "Last statement";
// 脚本至此结束,并无 PHP 结束标记
怎麼防止 SQL 注入攻擊(SQL Injection)?
1、過濾掉一些常見的資料庫操作關鍵字:select, insert, update, delete, and, * 等
或者通過系統函數:addslashes (需要被過濾的內容) 來進行過濾。
2、在 PHP 配置文件中
Register_globals=off; 設置為關閉狀態 //作用將註冊全局變量關閉。
比如:接收 POST 表單的值使用 $_POST['user'], 如果將 register_globals=on; 直接使用 $user 可以接收表單的值。
3、SQL 語句書寫的時候儘量不要省略小引號 (tab鍵上面那個) 和單引號
4、提高資料庫命名技巧,對於一些重要的欄位根據程序的特點命名,取不易被猜到的
5、對於常用的方法加以封裝,避免直接暴漏 SQL 語句
6、開啟 PHP 安全模式
Safe_mode=on;
7、打開 magic_quotes_gpc 來防止 SQL 注入
Magic_quotes_gpc=off; 默認是關閉的,它打開後將自動把用戶提交的 sql 語句的查詢進行轉換,把 ' 轉為 \',這對防止 sql 注入有重大作用。
因此開啟:magic_quotes_gpc=on;
8、控制錯誤信息
關閉錯誤提示信息,將錯誤信息寫到系統日誌。
9、使用 mysqli 或 pdo 預處理。
PHP-MySQL, PHP-MySQLi, PDO 的差異討論:
http://www.tsingpost.com/articles/201312/239.html
https://blog.roga.tw/2010/06/2403
教學:http://140.114.89.25/~geniusturtle/tutor_web/php_mysqli_pdo.php
MySQLi 的用法
http://php.net/manual/en/function.mysqli-connect.php
http://php.net/manual/en/mysqli.query.php
<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
if (!$link) {
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;mysqli_close($link);?>
PDO 的用法
http://easonyo.pixnet.net/blog/post/22966510
http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php
<?php
$dsn = "mysql:host=localhost;dbname=test";
$db = new PDO($dsn, root, );
$count = $db->exec("INSERT INTO foo SET name = heiyeluren,gender=男,time=NOW()");
echo $count;
$db = null;
?>
SELECT, INSERT, UPDATE, DELETE prepared queries
SELECT:$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name"); $stmt->execute(array(':name' => $name, ':id' => $id)); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);INSERT:$stmt = $db->prepare("INSERT INTO table(field1,field2) VALUES(:field1,:field2)"); $stmt->execute(array(':field1' => $field1, ':field2' => $field2)); $affected_rows = $stmt->rowCount();DELETE:$stmt = $db->prepare("DELETE FROM table WHERE id=:id"); $stmt->bindValue(':id', $id, PDO::PARAM_STR); $stmt->execute(); $affected_rows = $stmt->rowCount();UPDATE:$stmt = $db->prepare("UPDATE table SET name=? WHERE id=?"); $stmt->execute(array($name, $id)); $affected_rows = $stmt->rowCount();
PHP 程式設計實務上常見的問題:
1. include 與 require 的區別,require 與 require_once 的效率哪個高?
2. cookie 和 session 的區別,禁止了 cookie 後 session 能正常使用嗎?session 的缺點是什麼? session 在伺服器端是存在哪裡的?是共有的還是私有的?
3. 怎麼防止 sql 注入?
4. 資料庫索引有幾類,分別是什麼?什麼時候該用索引?
5. 引用傳值和非引用傳值的區別,什麼時候該用引用傳值?什麼時候該用非引用傳值?
6. 寫幾個魔術方法並說明作用?
7. $_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILE 的意思是什麼?
8. 數組中下標最好是什麼類型的,為什麼?
9. ++i 和 i++ 哪一個效率高,為什麼?
10.magic_quotes_gpc()、magic_quotes_runtime() 的意思是什麼?
11.Echo()、print()、print_r() 的區別?
12.MVC 概念與其優缺點
13. 框架中,什麼是單一入口和多入口?單一入口的優缺點?
14.列印一個用『.』連結的字符串時候,還可以用什麼代替『.』連結效率更高些?
15. 提示類型 200、404、502 是什麼意思?
16. 編寫一個自定義函數提取這段路徑的的後綴名
17. Memcach 優缺點有哪些?
18. PHP 需不需要結尾標籤?
PHP学习路线图
PHP学习的关键是:多看代码,多写代码,多总结。
https://github.com/yeszao/phproad
HTML5 和 CSS
推荐书籍《HTML5+CSS3从入门到精通》·李东博
HTML标签
CSS样式
Javascript脚本
PHP 基础
推荐书籍《PHP编程》·Kevin Tatroe,Peter MacIntyre,Rasmus Lerdorf
变量
数组
循环控制
函数
Cookie 和 Session
JSON 和 XML
AJAX
文件读写
上传和下载
图片处理
RESTful
WEB 服务器
推荐书籍《鸟哥的Linux私房菜基础篇》·鸟哥
Linux基础
LNMP安装
PHP-FPM配置
PHP MySQL 操作
推荐书籍《PHP和MySQL Web开发》·Luke Welling
增查改删操作
表单处理
MySQLi和PDO扩展
PHP 面向对象和设计模式
推荐书籍《深入PHP:面向对象、模式与实践》·Matt Zandstra
类和对象的关系
继承、封装、多态
性状
面向对象设计原则
类UML关系
设计模式
代码编写和规范
推荐书籍《代码整洁之道》·Robert C. Martin
PHP-FIG PSR1~4规范
phpStorm集成开发环境
Git版本控制
Github代码仓库
MVC 框架
单一入口
MVC职责划分
PHP框架
组件
Composer
组件
Nginx
推荐书籍《Nginx高性能Web服务器详解》·苗泽,《大型网站技术架构 核心原理与案例分析》·李智慧
Nginx配置优化
负载均衡
反向代理
集群
CDN
数据库
推荐书籍《高性能MySQL》·Baron Schwartz,Peter Zaitsev,Vadim Tkachenko
ORM
索引和全文索引
锁机制
分表
集群
Redis缓存
PHP 高级
推荐书籍《Modern PHP》·Josh Lockhart
Opcache
xDebug调试和分析
Xhprof + Xhgui性能分析
PHPUnit单元测试
持续集成


