2014年辛星starphp第一节设置入口文件以及App类

时间:2022-10-25 19:19:59

     

*********************本节目标****************

1.首先是我们的框架大致布局,我们即将写成的这个框架,它的入口文件统一为star.php,它需要做的一些事,比如加载配置项,日志文件什么的日后再说,首先确定一下它的目录结构,它的目录结构是如下的样子:

|---------star
|   |------------core:核心类库
|   |     |---------------app.php
|   |     |---------------model.php
|   |     |---------------controller.php
|   |     |----------------view.php
|   |     |-----------------fun.php
|   |
|   |-------------common:函数库
|   |-------------class:类库
|   |-------------extends:其他类库
|   |--------------star.php
|
|-----------app它的文件目录为
|   |------------遵循模块/控制器/方法的格式
|   |------------index.php
|
|------------adimin
|
2.我们今天先写这个star.php文件,它是统一的入口文件,首先我们必须定义一个index.php,它的文件内容如下:

<?php 
//定义它是从首页进入的
define('INDEX',True);
//包含该核心文件
define('__ROOT__',__DIR__);
include __ROOT__.'/star/star.php';

3.然后我们书写star.php的内容,它能够引导找到App类,并且调用App类的run方法来使程序运行下去,它的代码:

<?php
//定义版本信息
define("VERSION","0.1");
//控制PHP版本
if(phpversion() <'5.3'){
	exit("版本太低不支持");
} 

//表示路径分隔符
define("DS",DIRECTORY_SEPARATOR);
//这个STAR表示我们的star目录
if(!defined("STAR")){define("STAR",__DIR__);}
//定义应用程序目录,
if(! defined("APP")){define("APP",__ROOT__.DS."app");}
if(! defined("CORE")){define("CORE",STAR.DS."core");}
//导入应用程序控制文件  
include STAR.DS."core".DS."app.php";
//导入核心文件
include CORE.DS."fun.php";
$app = new  App();
$app->run();
4.然后我们写这个App类,它应该能够完成对URL的解析,这里我们还没有设置配置文件,因此我们的URL统一使用PATHINFO模式,而且路径分隔符统一用斜线,而且我们的url的文件名的后部分是按照”模块/控制器/方法/参数1/值1/参数2/值2...."的方式去写的,因此,我们的app.php文件如下:

<?php
/**
*该类用于统一处理所有的信息
*
*/
if(!defined("STAR")) die("系统错误");
include STAR.DS."core".DS."controller.php";
class App{
	//模块名
	private $module = "";
	//控制器
	private $controller = "";
	//方法名
	private $method = "";
	//参数名
	private $param = array();
	//参数个数
	private $paramlength = 0;
	/**
	*用于解析控制器和方法
	*
	*/
	public function __construct(){
		//默认使用/来解析url
		$path  = trim($_SERVER['PATH_INFO'],'/');
		$path = explode('/',$path);
		var_dump($path);
		$paramlength =(count($path) - 3)/2;
		var_dump($paramlength);
		$this->paramlength = $paramlength;
		$module  = array_shift($path);//模块名
		$controller = array_shift($path);//控制器名
		$method = array_shift($path);//方法名
		var_dump($path);
		for($i = 0;$i <$paramlength;$i++){
			$param[] = $path[2*$i + 1];
		}
		var_dump($param);
		$param = star_arr_safe($param);
		var_dump($param);
		$this->param = $param;
		if($module ==""){$module = "index";}
		if($controller == ""){$controller = "Index";}
		if($method == ""){$method = "index";}
		$this->module = $module;
		$this->controller = $controller;
		$this->method = $method;
		//spl_autoload_register($this->loadcore);
		//自动根据解析的路由来执行

	}
	/**
	*用于运行方法
	*
	*/
	public function run(){
		$controller = $this->controller;
		$module = $this->module;
		$dir = APP.DS.$module.DS."controller".DS."$controller"."Controller.php";
		include "$dir";
		$controllerclass = $controller."Controller";
		$class = new $controllerclass();
		$method = $this->method;
		$param = $this->param;
		$length = $this->paramlength;
		if(is_int($length) && ($length >= 1)){
			$class->$method($param);
		}else{
			$class->$method();
		}
		
	}

	/**
	*
	*
	*/
	
}
5.我们还需要在core文件夹的fun.php文件中添加一些代码,它有一个star_arr_safe函数用来对数组进行过滤,来防止非法注入,它的内容如下:

<?php
/**
*用于过滤用户输入信息的函数
*它主要是防止sql注入
*也需要防范html实体
*/
function star_arr_safe($array){
	if(is_array($array)){
		$count = count($array);
		for($i = 0;$i< $count;$i ++){
			$array[$i] = htmlspecialchars($array[$i]);
			$array[$i] = addslashes($array[$i]);
		}
	}
	return $array;
	
}

6.我们的Controller还没有实际的意义,但是为了能够起到形式上的作用,我们定义如下:

<?php
/**
*该类用于解析url并且根据url来执行相关的方法
*
*/
if(!defined("STAR")) die("系统错误");
class Controller{
	
}
7.截至目前,我们先写这些代码。



*****************辅助工作***************

1.为了测试运行,我们在app目录下的controller目录下新建了一个MyController.php,它有一个index方法,我们这里给定如下:

<?php
if(!defined("STAR")) exit("Not Allowed");

class MyController extends Controller{
	public function index($arr){
		echo "hello world";
		var_dump($arr);
		
	}
}
2.该版本目前运行正常,版本号记为0.0.1,代码我上传到csdn的下载的地方:
点击打开链接  ,当然是面积分下载的。

3.该版本可以作为我日后的回忆,哈哈。