聊聊mPHP之自动加载类函数(一)
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/30/ ]
很多时候,这些看似讲的很详尽的文字,反而让刚学习的朋友产生心里暗示,认为MVC很难掌握.一开始我也有这样的反应,后来我开始构思一个精简的MVC框架,就是mPHP最初的原型,把程序的逻辑代码写了一边,虽然调试的过程很繁琐,但运行成功后,整个人就豁然开朗了.
什么是MVC?MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,紧接着的是更飘渺的文字介绍。
很多时候,这些看似讲的很详尽的文字,反而让刚学习的朋友产生心里暗示,认为MVC很难掌握。一开始磨途歌也有这样的反应,后来我开始构思一个精简的MVC框架,就是mPHP最初的原型,把程序的逻辑代码写了一边,虽然调试的过程很繁琐,但运行成功后,整个人就豁然开朗了。
在此,请先忘掉那些MVC的定义,跟着我慢慢往下学习,成功的捷径是一步一个脚印。
下面先介绍分析mPHP框架用到的原生技术。
第一节:function __autoload($className) {},这是PHP自动加载类的一个关键技术,先看以下代码。
例一)类声明与类调用都写在一个PHP文件里:
<?php class mPHP { public function __construct() { echo '这是mPHP类'; } } $objMPHP = new mPHP();//会输出 这是mPHP类 ?>
例二)类声明与调用分别写在不同的PHP文件:
<?php /* 当前文件为mPHP.php 声明类mPHP */ class mPHP { public function __construct() { echo '这是mPHP类'; } } ?> <?php /* 当前文件为 index.php,与mPHP.php在同一目录下 必须加载声明类mPHP的PHP文件,才能通过 new mPHP()来创建类a的实例 */ include 'mPHP.php'; $objMPHP = new mPHP();//会输出 这是mPHP类 ?>
例三)类声明与调用分别写在不同的PHP文件,通过function __autoload($className) {}调用:
<?php /* 当前文件为 autoload.php 本例中的自动加载类文件规则 */ function __autoload($className) { include "{$className}.php"; } /* 简单说明如下: $objMPHP = new mPHP(); 当没有找到类mPHP的声明,PHP会把mPHP当成参数传递给现有的function __autoload($className) {} 然后再次尝试声明该类,在不考虑性能的前提下,它等效于下边的语句 include "mPHP.php"; $objMPHP = new mPHP(); */ ?> <?php /* 当前文件为 mPHP.php 声明类mPHP */ class mPHP { public function __construct() { echo '这是mPHP类'; } } ?> <?php /* 当前文件为 mo2g.php 声明类mPHP */ class mo2g { public function __construct() { echo '这是mo2g类'; } } ?> <?php /* 当前文件为 index.php,与autoload.php,mPHP.php,mo2g.php在同一目录下 通过在function __autoload($className) {}中设置的规则加载相应的类文件 */ include 'autoload.php'; $objMPHP = new mPHP();//会输出 这是mPHP类 $objMO2G = new mo2g();//会输出 这是mo2g类 /* 经过分析,很容易看出,上边3行代码等价于 include 'mPHP.php'; $objMPHP = new mPHP(); include 'mo2g.php'; $objMPHP = new mo2g(); */ ?>
__autoload的用法很有意思,只要把加载文件的规则定好,当类文件多起来,也很方便管理,虽然__autoload浪费了一些性能,但是我觉得完全可以接受。
本小结介绍了,function __autoload($className) {}
的神奇用法,把它理解了,距离成功,就更近一步了。
敬请期待,下一节——聊聊mPHP之控制器的秘密(二)。
我来说两句: