半干不湿的货,你要不要。
既然写框架,目录和内容尽量有个规矩
把之前写的HTTP DEMO 文件,重命名Server.php移到 frame/Lib/下
目录结构
frame
|-Lib
|-Server.php
在根目录上新建一个启动文件 start.php
<?php
require "./frame/Lib/Server.php";
可以试运行一下
root@localhost:/piz$ php start.php
服务启动 http://0.0.0.0:9501
启动成功。
接下来,写个加载器。
先确定命名空间 namespace,在第一篇内容里确定了项目目录
E:/wwwroot/
|-piz 项目目录
那咱就用piz命名框架,为了好看些就首字母大写 Piz
我参考ThinkPHP的加载器并做了个简化,目的是能满足我们的需求就行,以下加载器的代码。
<?php
/**
* 加载器
*/
namespace Piz;
class Loader
{
// 类名映射
protected static $map = [] ;
//命名空间映射
protected static $namespaces = [] ;
public static function register(){
spl_autoload_register ('\\Piz\\Loader::autoload',true , true );
self::addNamespace ('Piz',__DIR__.'/');
}
public static function autoload($class){
if($file = self::find($class)){
include $file;
return true;
}
}
//查找文件,并映射到$map
private static function find($class){
if(!empty(self::$map[$class])){ //如果已存在就直接返回
return self::$map[$class];
}
//下面就是找啊找。。
$classes = array_filter(explode ('\\',$class ));
$namespace = array_shift ($classes);
$logicalPath = join (DIRECTORY_SEPARATOR ,$classes) .'.php';
if(isset(self::$namespaces[$namespace]) ){ // 如果命名空间已注册,那就往下找。
$dir = self::$namespaces[$namespace] ;
if(is_file ($path = $dir.$logicalPath)){
self::$map[$class] = $path;
return $path;
}
echo "{$dir}{$logicalPath} 找啊找,找不到,你说气人不气人",PHP_EOL;
}
return false;
}
// 注册 类
public static function addMap($class , $map = ''){
self::$map[$class] = $map ;
}
// 注册命名空间
public static function addNamespace($namespace,$path=''){
self::$namespaces[$namespace] = rtrim($path,'/').DIRECTORY_SEPARATOR;
}
}
拿去,保证能用。
热门评论
老哥 这个自动加载类放在那里啊