目录
搭建自己的PHP框架心得(二),搭建php框架心得
续言
回调函数
VIEW层和ob函数
类__URL__常量和全局类
用单例模式定义数据库连接基类
DB类的sql查询函数
后续
首页 php教程 php手册 搭建自己的PHP框架心得(二),搭建php框架心得

搭建自己的PHP框架心得(二),搭建php框架心得

Jun 13, 2016 am 08:42 AM
php

搭建自己的PHP框架心得(二),搭建php框架心得

续言

对于本次更新,我想说:

  • 本框架由本人挑时间完善,而我还不是PHP大神级的人物,所以框架漏洞难免,求大神们指出。
  • 本框架的知识点应用都会写在博客里,大家有什么异议的可以一起讨论,也希望看博客的也能学习到它们。
  • 本次更新,更新了函数规范上的一些问题,如将函数尽量的独立化,每一个函数尽量只单独做好一件事情,尽量减少函数依赖。还对框架的整体优化了一下,添加了SQ全局类,用以处理全局函数,变量。

再次贴出GITHUB地址:Sqier框架GITHUB地址


回调函数

替换了很low的类名拼装实例化,然后拼装方法名的用法,使用PHP的回调函数方式:

原代码:

1

2

3

4

5

<code>$controller_name = 'Controller\\' . self::$c_name;

$action_name = self::$a_name . 'Action';

$controller = new $controller_name();

$controller->$action_name();

</code>

登录后复制

修改后代码

1

2

3

4

5

6

7

<code>    $controller_name = 'Controller\\' . self::$c_name;

    $controller = new $controller_name();

    call_user_func([

        $controller,

        self::$a_name . 'Action'

    ]);

</code>

登录后复制

这里介绍一下PHP的函数回调应用方式:call_user_func和call_user_func_array:

1

2

3

<p>call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] )</p>

<p>调用第一个参数所提供的用户自定义的函数。</p>

<p>返回值:返回调用函数的结果,或FALSE。</p>

登录后复制

call_user_func_array()的用法跟call_user_func类似,只不过传入的参数params整体为一个数组。

另外,call_user_func系列函数还可以传入在第一个参数里传入匿名参数,可以很方便的回调某些事件,这些特性在复杂的框架里应用也十分广泛,如yii2的事件机制里回调函数的使用就是基于此。


VIEW层和ob函数

框架在controller的基类中定义了render方法来渲染页面,它会调用类VIEW的静态函数来分析加载对应页面的模板。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>public static function display($data, $view_file) {

 

    if(is_array($data)) {

        extract($data);//extract函数解析$data数组中的变量

    }else {

        //抛出变量类型异常

    }

 

    ob_start();

    ob_implicit_flush(0);

    include self::checkTemplate($view_file);//自定义checkTemplate函数,分析检查对应的函数模板,正常返回路径

    $content = ob_get_clean();

 

    echo $content;

}

</code>

登录后复制

这里重点说一下ob(output buffering)系列函数,其作用引用简明代魔法的ob作用介绍:

  • 防止在浏览器有输出之后再使用setcookie,或者header,session_start函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。
  • 捕捉对一些不可获取的函数的输出,比如phpinfo会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
  • 对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
  • 生成静态文件,其实就是捕捉整页的输出,然后存成文件,经常在生成HTML,或者整页缓存中使用。

它在ob_start()函数执行后,打开缓冲区,将后面的输出内容装进系统的缓冲区,ob_implicit_flush(0)函数来关闭绝对刷送(echo等),最后使用ob_get_clean()函数将缓冲区的内容取出来。


类__URL__常量和全局类

TP里的__URL__等全局常量用着很方便,可以很简单的实现跳转等操作,而定义它的函数createUrl函数我又想重用,于是借鉴YII的全局类定义方法:

定义基类及详细方法(以后的全局方法会写在这里)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>class BaseSqier{

    //方法根据传入的$info信息,和当前URL_MODE解析返回URL字符串

    public static function createUrl($info = '') {

        $url_info = explode('/', strtolower($info));

        $controller = isset($url_info[1]) ? $url_info[0] : strtolower(CONTROLLER);

        $action = isset($url_info[1]) ? $url_info[1] : $url_info[0];

        switch(URL_MODE){

            case URL_COMMON:

                return "/index.php?r=" . $controller . '/' . $action;

            case URL_REWRITE:

                return '/' .$controller . '/' . $action;

        }

    }

 }

</code>

登录后复制

在启动文件中定义类并继承基类;

1

2

3

4

<code>require_once SQ_PATH.'BaseSqier.php';

class SQ extends BaseSqier{

}

</code>

登录后复制

在全局内都可以直接使用SQ::createUrl()方法来创建URL了。这样,定义__URL__常量就很轻松了。


用单例模式定义数据库连接基类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>class Db {

    protected static $_instance;

    public static function getInstance() {

        if(!(self::$_instance instanceof self)) {

            self::$_instance = new self();

        }

        return self::$_instance;

    }

 

    private function __construct() {

        $link = new \mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME) or die("连接数据库失败,请检查数据库配置信息!");

        $link->query('set names utf8');

    }

    public function __clone() {

        return self::getInstance();

    }

}

</code>

登录后复制

使用单例模式的核心是:

  • 私有化构造函数,使无法用new来创建对象,也防止子类继承它并改写其构造函数;
  • 用静态变量存放当前对象,定义静态方法来返回对象,如对象还未实例化,实例化一个,存入静态变量并返回。
  • 构造其__clone魔术方法,防止clone出一个新的对象;

DB类的sql查询函数

DB查询函数是一个很复杂的部分,它是一个自成体系的东西,像TP和YII的查询方法都有其独特的地方。我这里暂时先借用TP的MODEL基类,有时间再慢慢补这个。

嗯,介绍一下像TP的查询里的方法联查的实现,其诀窍在于,在每个联查方法的最后都用 return this 来返回已处理过的查询对象。


后续

yii2里的数据表和model类属性之间的映射很酷(虽然被深坑过), 前面一直避开的模块(module,我可以想像得到把它也添加到URI时解析的麻烦)有时间考虑一下。

边写边优化。

嗯,待续... 对了,宣传一下自己的个人站:www.alwayscoding.cn 我的联系方式在留言板页面的右侧,有问题可以在那里交流。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1254
24
PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

See all articles