1. 程式人生 > >PHP框架解析之從入口說起index.php

PHP框架解析之從入口說起index.php

    <?php
    header("Content-type:application/json;charset=utf-8");
    error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT ^ E_WARNING);
    ini_set("display_errors", "On");

    define("ROOT_DIR", dirname(__FILE__));
    define("DS", DIRECTORY_SEPARATOR);
    define("CORE_DIR", ROOT_DIR . DS . 'framework'
); require_once ROOT_DIR . DS . 'stdafx.php'; require_once CORE_DIR . DS . 'Core.php'; try { $core = Core::getInstance()->boot(ROOT_DIR . '/config/core.php');//->run(); $core->registerPlugin(new LoginPlugin()); $core->run(); } catch (Exception $ex) { echo
json_encode(array('NOT FOUND')); print $ex; die; }

1、Http header設定Content-type
2、ini_set(“display_errors”, “On”)開啟報錯機制,error_reporting() 設定 PHP 的報錯級別

常量 描述
1 E_ERROR 致命的執行錯誤。錯誤無法恢復,暫停執行指令碼。
2 E_WARNING 執行時警告(非致命性錯誤)。非致命的執行錯誤,指令碼執行不會停止。
4 E_PARSE 編譯時解析錯誤。解析錯誤只由分析器產生。
8 E_NOTICE 執行時提醒(這些經常是你程式碼中的bug引起的,也可能是有意的行為造成的。
16 E_CORE_ERROR PHP啟動時初始化過程中的致命錯誤。
32 E_CORE_WARNING PHP啟動時初始化過程中的警告(非致命性錯)。
64 E_COMPILE_ERROR 編譯時致命性錯。這就像由Zend指令碼引擎生成了一個E_ERROR。
128 E_COMPILE_WARNING 編譯時警告(非致命性錯)。這就像由Zend指令碼引擎生成了一個E_WARNING警告。
256 E_USER_ERROR 使用者自定義的錯誤訊息。這就像由使用PHP函式trigger_error(程式設計師設定E_ERROR)
512 E_USER_WARNING 使用者自定義的警告訊息。這就像由使用PHP函式trigger_error(程式設計師設定的一個E_WARNING警告)
1024 E_USER_NOTICE 使用者自定義的提醒訊息。這就像一個由使用PHP函式trigger_error(程式設計師一個E_NOTICE集)
2048 E_STRICT 編碼標準化警告。允許PHP建議如何修改程式碼以確保最佳的互操作性向前相容性。
4096 E_RECOVERABLE_ERROR 開捕致命錯誤。這就像一個E_ERROR,但可以通過使用者定義的處理捕獲
8191 E_ALL 所有的錯誤和警告(不包括 E_STRICT) (E_STRICT will be part of E_ALL as of PHP 6.0)


3、獲取當前檔案絕對路徑 dirname(FILE)
4、引入檔案stdafx.php和Core.php
stdafx.php主要作用是定義常量和引入相關php檔案:

<?php
date_default_timezone_set("Asia/Chongqing");
define('CONFIG_DIR', ROOT_DIR . DS . 'config');
require_once CONFIG_DIR . '/db.php';
require_once CONFIG_DIR . '/mc.php';
...
require_once CONFIG_DIR . '/define.php';

Core.php是整個框架的核心:

  • include與require : 最大區別是當檔案不是必需的,且應用程式在檔案未找到時應該繼續執行時可以使用include
  • _autoload與 spl_autoload_register:在php5之後可以在index.php中通過編寫__autoload函式來讓php自動載入類,也可以使用spl_autoload_register來註冊我們自己的autoload函式來處理載入尚未定義的類
  • isset與empty:
    • isset:檢測變數是否設定 ,若變數不存在則返回 FALSE 若變數存在且其值為NULL,也返回 FALSE
      若變數存在且值不為NULL,則返回 TURE ,同時檢查多個變數時,每個單項都符合上一條要求時才返回 TRUE,否則結果為 FALSE.
    • empty:檢查一個變數是否為空,若變數存在且其值為”“、0、”0”、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的物件,則返回 TURE

5、Core::getInstance()單例模式例項化Core物件,初始化autoload載入機制(自定義loadClass),boot載入控制器、模型、檢視,外掛、庫,路由規則等配置
6、註冊LoginPlugin登入外掛通過依賴注入的方式進行訪問的身份驗證檢查
7、run根據路由規則分發機制以及path_info資訊,解析出控制器類,例項化並呼叫IndexAction對請求進行處理