改造 ThinkPHP,弃用 D() 等魔术函数
ThinkPHP 是国内比较优秀的 PHP 框架,但有些地方不是很好,比如那些 魔术函数 D(),用它返回的类实例,在各个IDE(如 PhpStorm)下根本识别不了,导致如下问题:
1、不支持 代码自动提示;
2、不支持 按住 Ctrl 键,点击 方法名,进入 方法的 定义处;
3、不支持 重构;
4、不支持 方法被使用/调用 统计;
等等问题;
总而言之,强大的IDE(PhpStorm)拿它一点办法都没有。
于是,越来越讨厌这样的 D()函数,,,改造一下它吧,操作过程如下:
1、新建 Base.class.php 类文件(文件路径为:ThinkPHP/Library/Think/Base.class.php),其内容如下:
<?php namespace Think; /** * 业务基类 * * @package framework * @author 52php.cnblogs.com */ class Base { /** * 类实例化 */ public static function instance() { static $_instance = array(); $classFullName = get_called_class(); if (!isset($_instance[$classFullName])) { if (class_exists($classFullName)) { $instance = $_instance[$classFullName] = new static(); return $instance; } else { throw new \Exception('"' . $classFullName . '" was not found !'); } } return $_instance[$classFullName]; } }
2、修改下 Model类(文件路径为:ThinkPHP/Library/Think/Model.class.php),让它继承上面的 Base类:
<?php namespace Think; /** * ThinkPHP Model模型类 * 实现了ORM和ActiveRecords模式 */ class Model extends Base { // 操作状态 const MODEL_INSERT = 1; // 插入模型数据 const MODEL_UPDATE = 2; // 更新模型数据 const MODEL_BOTH = 3; // 包含上面两种方式 // .... 后面的代码 被省略 }
3、改造后,效果如下:
//【现在的 写法】 $userList = UserMainModel::instance()->getByUserId('300061'); //【老的 写法】 $userList = D('UserMain')->getByUserId('300061');
注意:先前的 D() 函数不受影响!