1.4 Frameworkクラス実装
1.4.1定数定義されたパス
使用のファイルパス高周波、および長いパスので、固定された経路定義された定数のパス以来
知識ポイント
1、getcwd():入口文件的绝对路径
2、windows下默认的目录分隔符是`\`,Linux下默认的目录分隔符是`/`。DIRECTORY_SEPARATOR常量根据不同的操作系统返回不同的目录分隔符。
コードの実装
Framework.class.phpフォルダコアの下に作成
private static function initConst(){
define('DS', DIRECTORY_SEPARATOR); //定义目录分隔符
define('ROOT_PATH', getcwd().DS); //入口文件所在的目录
define('APP_PATH', ROOT_PATH.'Application'.DS); //application目录
define('CONFIG_PATH', APP_PATH.'Config'.DS);
define('CONTROLLER_PATH', APP_PATH.'Controller'.DS);
define('MODEL_PATH', APP_PATH.'Model'.DS);
define('VIEW_PATH', APP_PATH.'View'.DS);
define('FRAMEWORK_PATH', ROOT_PATH.'Framework'.DS);
define('CORE_PATH', FRAMEWORK_PATH.'Core'.DS);
define('LIB_PATH', FRAMEWORK_PATH.'Lib'.DS);
define('TRAITS_PATH', ROOT_PATH.'Traits'.DS);
}
1.4.2導入のプロフィール
configディレクトリにconfig.phpファイルを作成します。1.
<?php
return array(
//数据库配置
'database'=>array(),
//应用程序配置
'app' =>array(
'dp' => 'Admin', //默认平台
'dc' => 'Products', //默认控制器
'da' => 'list' //默认方法
),
);
図2に示すように、フレーム・プロファイル・クラスに導入されています
private static function initConfig(){
$GLOBALS['config']=require CONFIG_PATH.'config.php';
}
質問:なぜ、コンフィギュレーション・ファイル定数に格納されていませんか?
A:7.0の前に、定数配列やオブジェクトを保存することはできませんので。
1.4.3ルートを決定します
P:[プラットフォーム]プラットフォーム
C:コントローラー[コントローラー]
A:アクション[方法]
private static function initRoutes(){
$p=$_GET['p']??$GLOBALS['config']['app']['dp'];
$c=$_GET['c']??$GLOBALS['config']['app']['dc'];
$a=$_GET['a']??$GLOBALS['config']['app']['da'];
$p=ucfirst(strtolower($p));
$c=ucfirst(strtolower($c)); //首字母大写
$a=strtolower($a); //转成小写
define('PLATFROM_NAME', $p); //平台名常量
define('CONTROLLER_NAME', $c); //控制器名常量
define('ACTION_NAME', $a); //方法名常量
define('__URL__', CONTROLLER_PATH.$p.DS); //当前请求控制器的目录地址
define('__VIEW__',VIEW_PATH.$p.DS); //当前视图的目录地址
}
1.4.4自動負荷クラス
private static function initAutoLoad(){
spl_autoload_register(function($class_name){
$namespace= dirname($class_name); //命名空间
$class_name= basename($class_name); //类名
if(in_array($namespace, array('Core','Lib'))) //命名空间在Core和Lib下
$path= FRAMEWORK_PATH.$namespace.DS.$class_name.'.class.php';
elseif($namespace=='Model') //文件在Model下
$path=MODEL_PATH.$class_name.'.class.php';
elseif($namespace=='Traits') //文件在Traits下
$path=TRAITS_PATH.$class_name.'.class.php';
else //控制器
$path=CONTROLLER_PATH.PLATFROM_NAME.DS.$class_name.'.class.php';
if(file_exists($path) && is_file($path))
require $path;
});
}
1.4.5リクエストの配布
private static function initDispatch(){
$controller_name='\Controller\\'.PLATFROM_NAME.'\\'.CONTROLLER_NAME.'Controller'; //拼接控制器类名
$action_name=ACTION_NAME.'Action'; //拼接方法名
$obj=new $controller_name();
$obj->$action_name();
}
1.4.6包装run()メソッド
class Framework{
//启动框架
public static function run(){
self::initConst();
self::initConfig();
self::initRoutes();
self::initAutoLoad();
self::initDispatch();
}
...
1.4.7コール入口run()メソッド
<?php
require './Framework/Core/Framework.class.php';
Framework::run();
フレームの開始後()メソッドの呼び出しを実行します。