从零开始撸一个PHP软件(一)入口文件及主控制器

一、

首先,安装好php运行环境,在运行目录下建立程序的跟目录文件和文件夹如图

data文件夹用来装我们需要上传或者存储的数据文件

extend文件夹用来装我们扩展功能

mod文件夹用来装我们的程序内核

.gitignore用来管理版本,暂时不用管它,以后会用到

index.php程序入口文件

README用来编写程序的介绍信息,暂时不管,以后再编辑

打开mod文件夹,在里面创建文件及文件夹如下

ajax用来装ajax的处理文件

class用来装工具类

config用来装默认配置文件

controller用来装基础模块的控制器

skin用来装默认皮肤

YhShow.php是程序的主控制器

二、

打开跟目录下的index.php写入代码片段

<?php
/*
*write by yuhou@brain yin
*20170922
*/

//引入app基类
define (“APP_ROOT”, dirname(__file__).DIRECTORY_SEPARATOR);//定义一个常量存储app路径
include(“mod/YhShow.php”);//引入app基类
//载入配置文件
$config_path = “mod/config/config.php”;//定义配置文件路径
$config = is_file($config_path)?include($config_path):null;//如果文件存在载入配置文件,如果不存在为空
//加载程序
YhShow::createApp(“App”,$config)->run();//开始运行
?>

打开mod文件夹中的YhShow.php写入代码

<?php
/*
*write by yuhou@brain yin
*20170923
*/
define(‘DEBUG’,false);//定义一个常量,控制是否为调试模式
spl_autoload_register(‘YhShow::autoload’);//为了节省频繁写require_once 的烦恼,注册一个自动引入文件的模块

//规范接口,强迫自己为每一个模块添加run函数
interface Application{
public function run();
}

//app基类
class YhShow{
//当前的application,想用它实现类似JQuery一样的链式操作
private static $_app;
//错误处理控制器
private static $_errors;
//存放对应的文件是否引入,便于调试
private static $_is_imports = array();
//错误标志
private static $_is_error = true;

//自动加载类文件,查询顺序优先为内核的核心模块控制器,其次是扩展的模块控制器,再次是内核的工具类,查询存在文件自动引入,并写入引入信息
public static function autoload($className){
$fileName = $className.”.php”;
if(file_exists(APP_ROOT.”/mod/controller/{$fileName}”)){
require_once(APP_ROOT.”/mod/controller/{$fileName}”);
array_push(self::$_is_imports, “/mod/controller/{$fileName}”);
}
else if(file_exists(APP_ROOT.”/extend/{$fileName}”)){
require_once(APP_ROOT.”/extend/{$fileName}”);
array_push(self::$_is_imports, “/extend/{$fileName}”);
}
else if(file_exists(APP_ROOT.”/mod/class/{$fileName}”)){
require_once(APP_ROOT.”/mod/class/{$fileName}”);
array_push(self::$_is_imports, “/mod/class/{$fileName}”);
}
else{
echo $fileName.” doesn’t exist!”;
}
}

//获取版本号
public static function getVersion()
{
return ‘1.3’;
}

//获取app
public static function getApp(){
return self::$_app;
}

//获取错误控制器
public static function getErrors()
{
return self::$_errors;
}

//设置app
public static function setApp($app)
{
if(self::$_app === null || $app === null) self::$_app = $app;
}

//创建app
public static function createApp($className,$config=null)
{
date_default_timezone_set(‘Asia/Shanghai’);
register_shutdown_function(array(‘YhShow’,’exitScript’));//这个是注册一个app结束程序,我想要手动结束php缓冲区,以此来增加运行效率
self::$_app = $className;
return new $className($config);//注意到没有,这里没有引入类文件就实例化类,因为上面设置了自动注册
}

//执行完毕动作
public static function exitScript()
{
$error = ob_get_contents();
if(ob_get_length()>0)
ob_end_flush();//如果缓冲区字符大于0,则将它发送并释放
}
}
?>

三、

打开controller文件夹,新建一个文件,命名为Test.php并加入代码

<?php
class Test implements Application{
function __construct(){
echo “i am test!”;
}

function run(){
echo “i am run!”;
}
}
?>

打开根目录的index.php文件,将YhShow::createApp(“App”,$config)->run();改成YhShow::createApp(“Test”,$config)->run();

打开浏览器,在地址栏输入localhost/index.php确认,浏览器输出i am test! i am run!编写成功

 

 

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注