[首次分析]PHP写框架

2016-08-03 11:05:14 PHP 2788 0

index.php

<?php
/* @Author HLZ
 * @Time 2016年8月3日 15:00:35
 * @Description 框架价格分析
 * 初始目录 分三个部分
 * ①index.php
 *       入口文件设置,且统一命名空间
 *          a.设置常量
 *               define("HLZ_PATH",realpath(__DIR__));// 获取入口目录位置
 *               define("Mysql帐号密码");
 *          b.引入自己写的Model、View、Controller基类
 * ②App文件夹   分四个文件夹
 *      a.供引入的类库
 *      b.Controller
 *      c.View
 *      d.Logic
 *          要求:其命名空间与类名恰好能找到文件对应.class.php文件
 *      统一自动引入机制,与框架搭建过程中常用的方法,详见下文
 * */
define("HLZ_PATH", realpath(__DIR__ . "\\..")); // 这里只有一个文件,我就当作只有Controller目录吧

// Start.注意:这个是文件加载的方法,只能放在类外面
function __autoload($className)
{
    // 使用前提,命名空间得是 根,即namespace \;
    // Start:当实例化,对应的类,不存在于该php文件时,自动调用
    $file_where = HLZ_PATH . "/" . $className . '.class.php';
    $file_where = str_replace('\\', "/", $file_where); // 转义成可以require的格式
    if (file_exists($file_where)) {
        require_once "$file_where";
    }
    echo "已经require $file_where";
}

// a.接口类
interface test
{
    // 1.1.定义接口,interface
    // 接口算是一个抽象类,但是接口中每个被抽象的方法,都必须被继承的类,全部实现
    public function verify($username); // 验证用户名
    function info(); // 验证信息
}
// b.接口逻辑类
class hlz_vip implements test
{
    // 1.2.对应接口,实现,implements
    private $string = "VIP Interface Test!";
    public function verify($username)
    {
        if ($username == "") {
            return '您未填写用户名';
        }
        return "Hello " . $username . "!";
    }
    public function info()
    {
        return $this->string;
    }
}
// c.普通类
class show_info
{
    private $username;
    public function show($username)
    {
        $this->username = $username;
        $user_interface = new hlz_vip(); // 2.1.1接口的调用
        $msg['Status']  = $user_interface->verify($username);
        $msg['Info']    = $user_interface->info();
        echo json_encode($msg);
        return $this; // 3.0.链式调用,连贯操作,常应用于数据库操作
    }
    public function say()
    {
        echo "<h3>链式调用   成功!</h3>";

    }
    public function __construct()
    {
        // 3.1.当实例化对象时,自动调用,【可以用与类名一样的函数来赖实现】
        echo "<h3>对象创建  成功!</h3><br/>";
    }
    public function __call($function_name, $args)
    {
        // 4.1.当调用方法不存在时,自动调用
        echo "<h5>你所调用的函数:$function_name ,在该对象中不存在!</h5>";
        echo "<small>你刚刚输入的参数为:<br/>";
        print_r($args);
        echo "</small>";
    }
    public function __set($property_name, $value)
    {
        // 5.1.当变量不存在与对象中  或者  变量为该对象的私有属性的时,自动调用
        return $this->$property_name = $value;
    }
    public function __get($property_name)
    {
        // 6.1.当变量不存在与对象中  或者  变量为该对象的私有属性的时,自动调用
        return isset($this->$property_name) ? $this->$property_name : null;
    }
    public function __isset($property_name)
    {
        // 7.1.在类外部使用 isset() 函数来测定对象里面的私有成员是否被设定时,自动调用
        return isset($this->$property_name);
    }
}
$test = new show_info();
$test->show("HLZ")->say(); // 测试1:链式调用
$test->hlz("参数一", "参数二"); // 测试2:这个函数不存在于对象中
$test = new \API\HLZ(); // 测试3:未初始化引入对应类文件

HLZ.class.php

<?php
namespace API;

echo "自己加载成功";
class HLZ
{
    public function __construct()
    {
        echo "test类调用成功!";
    }
}

自动引入文件的问题

之前在调用的页面,没给命名空间,我们是用到的下面这个

<?php
function __autoload($className)
{
    require "$className";
}
可是,平时我们写框架的时候,加上命名空间是必须的

所以这里有一个新的方法由此而生
可以使用函数 spl_autoload_register
来注册一个类中的方法来代替 __autoload

具体如下

<?php
class require_file
{
    public static function load($className)
    {
        // 一定得是静态函数
        $file_where = HLZ_PATH . "/" . $className . '.class.php';
        $file_where = str_replace('\\', "/", $file_where); // 转义成可以require的格式
        if (file_exists($file_where)) {
            require_once "$file_where";
        }
        echo "已经require $file_where";
    }
}
// 登记自动加载的函数
// 实例化对象时,如果没有对应的类
// 命名空间的名称、自动加载的类名、类名对应的静态方法
spl_autoload_register(array(__NAMESPACE__ . "\\require_file", "load"));
注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处