美文网首页程序员PHP经验分享PHP实战
如何写一个属于自己的数据库封装(10) - 自动载入篇

如何写一个属于自己的数据库封装(10) - 自动载入篇

作者: 幼年期程序猿 | 来源:发表于2017-05-26 16:35 被阅读0次

    上一期 如何写一个属于自己的数据库封装(9) - DELETE篇
    下一期 如何写一个属于自己的数据库封装(11) - 关联关系篇

    本期要点

    PHP:spl_autoload_register - Manual

    开始之前

    requireinclude 是每一个 PHPER 都明白的操作,
    没有一个正常的程序员会写出上千行一页的代码然后为之自豪
    合理地将类和代码逻辑区分到不同的 PHP 文件, 再以模块的方式调用, 这才是正确的码字方式(至少我是这么认为的), 也方便后来的人维护更新(满满的怨念)

    项目逐渐成长, 一个后台功能需要调用的模块越多, require 可能已经成了累人的事

    重复性的代码逻辑必须以函数或类来取代

    require 也一样, 一个大型项目可能需要 require 十数个的 类文件, 这时候就应该使用 PHP 自带的魔术函数来实现自动载入类了

    在啰嗦也必须再三强调, 规范 是项目茁壮成长的唯一法则, 统一代码和文件的命名规范, 文件树的逻辑归类, 这些都很重要(不堪回首)

    spl_autoload_register

    如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。

    这是来自 PHP 官方文档的一句话, __autoload 函数将被取代, 请注意

    进入代码之前先展示一下我的项目文件夹结构

    • root => 项目根目录
      • lib => 数据库封装所在文件夹
        • Builder.php
        • Connector.php
        • Grammar.php
        • helper.php
        • Model.php
      • model => 已绑定的数据库表模型
        • Actor.php
        • Film.php
        • FilmActor.php
        • Language.php
        • more...

    新建一个文件, 命名为autoload.php

    autoload.php

    <?php
    // 先手动载入辅助函数
    require dirname(__DIR__).'/lib/helper.php';
    
    // PHP 5.3.0 起可以使用闭包函数, 所以我不新建函数了
    // $class 是需要加入的 PHP 类文件名
    spl_autoload_register(function ($class) {
        // 需要搜索的文件夹, 在前的优先度较高, 尽可能别取相同名字
        // lib => 数据库封装的源代码
        // model => 已绑定的数据库表模型
        $paths = ['lib', 'model'];
    
        // 根目录
        $root = dirname(__DIR__);
    
        // 循环预设需搜索的两个文件夹, 如果存在文件那就载入
        foreach ($paths as $path) {
            if(is_file("$root/$path/$class.php"))
                require "$root/$path/$class.php";
        }
    });
    
    

    就这么简单
    然后每回只需 require 一个文件就足够了

    例子

    <?php
    require __DIR__.'/lib/autoload.php';
    
    $p = [
        ['first_name', 'PENELOPE'],
        ['last_name', 'GUINESS']
    ];
    
    $a = Actor::join('film_actor', 'actor_id', 'actor_id')->take(10)->get();
    
    dd($a);
    

    完整代码

    源代码放在coding.net里, 自己领

    上一期 如何写一个属于自己的数据库封装(9) - DELETE篇
    下一期 如何写一个属于自己的数据库封装(11) - 关联关系篇

    相关文章

      网友评论

        本文标题:如何写一个属于自己的数据库封装(10) - 自动载入篇

        本文链接:https://www.haomeiwen.com/subject/lajxfxtx.html