改造 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() 函数不受影响!

时间: 2024-12-06 15:23:49

改造 ThinkPHP,弃用 D() 等魔术函数的相关文章

PHP超级全局变量、魔术变量和魔术函数

PHP在设计的时候已经预定义了9个超级全局变量.8个魔术变量和13魔术函数,这些变量和函数可以在脚本的任何地方不用声明就可以使用. 在PHP开发会频繁的使用这些变量和函数,这些变量和函数可以方便的帮我们解决很多问题.下面详细的讲解下PHP中的超级全局变量.魔术变量和魔术函数. PHP超级全局变量(9个) $GLOBALS 储存全局作用域中的变量 $_SERVER 获取服务器相关信息 $_REQUEST 获取POST和GET请求的参数 $_POST 获取表单的POST请求参数 $_GET 获取表单

PHP魔术函数、魔术常量、预定义常量

一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct() 当删除一个对象或对象操作终止时被调用. 3.__call() 对象调用某个方法, 若方法存在,则直接调用:若不存在,则会去调用__call函数. 4.__get() 读取一个对象的属性时,若属性存在,则直接返回属性值: 若不存在,则会调用__get函数. 5.__set() 设置一个

PHP_007 魔术变量和魔术函数

魔术变量 PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们在代码中的位置改变而改变. 例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定.这些特殊的常量不区分大小写,如下: __LINE__ 文件中的当前行号. 实例: <?php echo '这是第 " '  . __LINE__ . ' " 行'; ?> 以上实

PHP 魔术变量和魔术函数

魔术变量 PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们在代码中的位置改变而改变. 例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定.这些特殊的常量不区分大小写,如下: __LINE__ 文件中的当前行号. 实例: 复制代码 代码如下: <?php echo '这是第 " '  . __LINE__ . ' " 行'

魔术函数

<?php $dbhost = "localhost"; $dbuser = "root"; $dbpass = ""; $db = "bbs"; //编写数据库操作的魔术函数 function mysql_bind(){ global $dbhost,$dbuser,$db,$dbpass; //首先我们不知道外面会传入多少个参数 //可以用func_get_args()方法来获取全部传入参数,这个方法返回全部参数的数

PHP 魔术变量和魔术函数详解

魔术变量 PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们在代码中的位置改变而改变. 例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定.这些特殊的常量不区分大小写,如下: __LINE__ 文件中的当前行号. 实例: <?php echo '这是第 “ ' . __LINE__ . ' ” 行'; ?> 以上实例输出结果为: 这是第

序列化魔术函数__sleep()和反序列化魔术函数__wakeup()

1.string serialize ( mixed $value )— 产生一个可存储的值的表示 serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方. 这有利于存储或传递 PHP 的值,同时不丢失其类型和结构 想要将已序列化的字符串变回 PHP 的值,可使用 unserialize() @ 序列化数组 serialize($arr); 在设置cookie的时候可以通过序列化数组的形式传递多个值,然后在接收页面进行反序列化读取 @ 序列化对象 cla

PHP魔术函数

在PHP的世界中充满了魔幻的色彩,很多东西都是你想不到的,下面来给大家介绍下魔术函数. 魔术函数: __construct():构造函数在实例化对象时调用 __destuct():析构函数当删除一个对象或者对象操作终止时被执行,多用于释放空闲内存 __call(): 调用对象不存在的方法时被调用 __get(): 调用对象不存在的属性时被调用 __set():设置对象不存在的属性时被调用 __toSring():打印一个对象时被调用 __clone(): 克隆对象时被调用 __isset():检

详解PHP魔术函数、魔术常量、预定义常量

一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct() 当删除一个对象或对象操作终止时被调用. 3.__call() 对象调用某个方法, 若方法存在,则直接调用:若不存在,则会去调用__call函数. 4.__get() 读取一个对象的属性时,若属性存在,则直接返回属性值: 若不存在,则会调用__get函数. 5.__set() 设置一个