PHP是動態型別的Web開發的指令碼語言,PHP以頁面檔案作為載入和執行的單元,PHP現在有了Composer作為開發包管理。
1.使用Composer管理依賴
自從.NET開發用了Nuget管理程式集依賴,我就再也離不開它了,幸虧Java中也有Maven管理jar包,雖然開源中國的映象太慢但還有ibiblio的映象可用,PHP現在終於有了Composer(參考1)用來管理資源包。
(1)全域性安裝(參考2)
在指定安裝目錄中執行命令列:
php -r "readfile('https://getcomposer.org/installer');" | php
在指定安裝目錄中執行命令列:
echo @php "%~dp0composer.phar" %*>composer.bat
將指定安裝目錄新增到環境變數的系統變數Path中。
(2)專案安裝
在專案目錄中執行命令列:
php -r "readfile('https://getcomposer.org/installer');" | php
使用 composer.json 檔案配置依賴。如配置PHP中常用的日誌元件:
{ "require": { "monolog/monolog": "1.0.*" } }
使用命令列命令 php composer.phar install 安裝依賴的資源包。如果進行了全域性安裝,只需要執行composert install。
這會將生成 composer.lock 檔案並依賴下載資源包到 vendor 目錄,composer.lock 檔案是下載依賴時真正使用的檔案。
(3)升級依賴
專案使用 composer.lock 檔案維護依賴,如果我們需要使用更新版本的依賴,需要按需修改 composer.json 檔案並執行更新命令。全域性安裝:composer update,專案安裝使用:php composer.phar update。
(4)資源包查詢與映象
可以使用http://packagist.org檢索資源包,好比.NET中的https://www.nuget.org/packages/和Java中的http://search.maven.org/。
可以使用http://packagist.phpcomposer.com映象,全域性配置使用如下命令列命令:
composer config -g repo.packagist composer http://packagist.phpcomposer.com
專案配置使用如下命令列:
composer config repo.packagist composer http://packagist.phpcomposer.com
當然最簡單的方式是直接修改composer.config檔案:
{ "require": { "monolog/monolog": "1.0.*" }, "repositories": { "packagist": { "type": "composer", "url": "http://packagist.phpcomposer.com" } } }
(5)自動載入
Composert 在 vendor 目錄下自動生成並維護包含了全部依賴資訊的 autoload.php 檔案。因此我們只需要通過 autoload.php 使用第三方庫即可。例如:
<?php require 'vendor/autoload.php'; $log = new Monolog\Logger('name'); $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); $log->addWarning('Foo'); ?>
2.PHP基礎
(1)PHP類似C語系語法的指令碼語言。
如果你有C或C++語言的基礎,那麼很多概念和語法都可以直接對照。從大小寫敏感到註釋,從資料型別、函式、引數傳遞和成員引用等。從C/C++/Java/C#這一體系學習下來,再加上JavaScript指令碼語言的基礎,加點PHP的技能點水到渠成。
(2)PHP是動態型別語言。
PHP有和C語言等強型別語言一樣的資料型別定義,支援的型別也相仿,只是PHP中同一變數在不同時刻可以表示不同型別的資料,但同一時刻,每個變數都相當於強型別中的指定型別的變數。因此對於PHP,更適合的稱呼是動態型別。習慣使用Java/C#等強型別語言總會對動態型別的指令碼語言心存焦慮,可以通過PHP的型別檢查函式減少這方面的顧慮(is_bool\is_integer\is_double\is_string\is_null等)。
(3)PHP以頁面檔案方式執行。
無論如何使用PHP,PHP的都是以頁面檔案方式執行的,這和執行在瀏覽器端的JavaScript方式類似,JavaScript檔案只有在被載入到當前頁面才能引用和執行,PHP也只有在通過include或required方式載入後才能引用和執行,即使後續新增的 __autoload和spl_autoload依然只是簡化而非改變了其載入引用的本質。
(4)PHP不需要複雜的框架
PHP天生是處理Web請求的,HTTP協議相關的內容是PHP的重點,一般來講,除了縱向請求的處理,橫向的認證和授權控制部分,其他部分不應該過於依賴PHP,如果通過耦合性較高的Web框架使用PHP本身就是錯誤的。由於PHP本身的執行和載入方式,導致PHP天生就適合複用各種元件而非使用框架來解決問題。成天寄希望於框架的人,要麼是不想在PHP基礎要麼是不想在業務邏輯基礎上下功夫。
3.PHP常用檔案
(1)配置檔案config.php
應用配置的各種資訊定義在一個或多個配置檔案中。一般每次請求都會載入配置檔案,配置檔案中不只包含了資料庫連線資訊,如應用MVC時,每次請求都會載入配置檔案以便讀取所有URL和Controller以及View之間的規則。
(2)入口檔案index.php
處理首頁請求或全部請求的檔案。index.php在實現PHP的MVC時是天然的前段控制器FrontController,由index.php負責縱向的處理請求轉發,橫向的認證和授權等處理檔案,等也需要在index.php中載入。
(3)資料訪問檔案database.php
database.php是工具類中最主要的用於資料訪問的檔案,為了避免資料訪問中重複性出現的程式碼,一般的PHP應用程式都會獨立的一個或一組資料訪問檔案。
4.自定義Session
在PHP中自定義Session比Java中方便多了,只需要將自定義的函式名稱做為引數傳遞給session_set_save_handler($open, $close, $read, $write, $destroy, $gc)作為引數即可,我們自定義一個使用cookie作為儲存的session,作為演示沒有對資料長度進行驗證,也沒有使用對稱加密解密。
<?php function open_session() { return true; } function close_session() { return true; } function read_session($id) { if ($_COOKIE[$id]) { return base64_decode($_COOKIE[$id]); } return ''; } function write_session($sid, $data) { if ($_COOKIE['session_end']) { setcookie($sid, base64_encode($data), $_COOKIE['session_end']); } else { $start = time() + session_get_cookie_params()['lifetime']; setcookie('session_end', $start, $start); setcookie($sid, base64_encode($data), $start); } return true; } function destroy_session() { $_Session = array(); return true; } function gc_session() { return true; } ini_set("session.cookie_lifetime", "3600"); session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'gc_session'); session_start(); $_SESSION['count'] += 1; echo $_SESSION['count']; session_write_close(); ?>