thinkphp3.0时下载过一个thinkphp,只完成了安装,测试页面就没有兴趣玩儿下去了.
后来一直用 YII,现在由于某种特殊的原因,又开始接触 ThinkPhp,官网目前最新版本是3.2.
安装测试版本后,调用数据,发现问题.
直接使用 M函数无法获取模型.
于是看了下文档,因为使用的数据库是以前某个项目的.表的命名没有前缀,表名类似 UserInfo 这样的名称.
似乎不符合 tp 的要求(Yii的话,会更灵活的多,不管你有没有表前缀,不管你表的命名).
但 tp还有一些解决方案可供选择.
这里采用了添加 model.
<?php namespace Home\Model; class UserInfoModel extends \Think\Model { public $tableName = "UserInfo"; protected $tablePrefix = ''; protected $trueTableName = 'UserInfo'; public function UserInfoModel() { } public function __construct() { parent::__construct (); } }
// 本类由系统自动生成,仅供测试用途 namespace Home\Controller; use Think\Controller; use Home\Model\UserInfoModel as User; class IndexController extends Controller { public function index() { $orders = new User (); $result = $orders->select (); dump ( $result ); } }
出现标题所示问题的原因大致如下:
1.定义的 model 没有放在合适的位置.
2.定义的 model 没有引用命名空间.
3.表的名称不符合 thinkphp 命名规范,而且没有声明关于数据表名称的属性定义.
解决要点:
1.model,通常放在 module->Moel->xxx.class.php(注意 tp的命名规范).
关于命名空间和自动加载的问题可看下3.2文档《架构》——>《命名空间》一节,另 php官网关于 namespace 传送门
2.在 model 里要先引用tp 的 model 类,或者如上所示代码中直接 extends.
3.看下文档《基础》——>《开发规范》和《模型》——>《模型定义》一节
ps1: tp3.2的文档中提出装要求安装环境必须 PHP5.3及以后版本并且 dev,及 PHP6可以,与命名空间及 autoload 等魔述方法不无关系.
ps2:顺便喷一下 tp 的命名空间,YII 中同样也引入了命名空间的概念,但使用起来会更舒服一些(且版本要求更低一些)。