先从国产的方便学习的ThinkPHP框架开始学起,stay hungry, stay
foolish.
关于ThinkPHP
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进。
[1]
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。
作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。
摘自百度百科。
目录信息
框架就的作用就像一个毛坯房,他提供了各种房间:卧室、客厅、厨房、厕所等等,也提供了各类方法:电线插板、空调线口、下水道等等。充分了解一个框架有助于我们去更好的工作。下面我们来看看ThinkPHP的框架目录信息以及各自的作用。
这是官方文档给出的目录信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| ├─application 应用目录 │ ├─common 公共模块目录(可以更改) │ ├─module_name 模块目录 │ │ ├─config.php 模块配置文件 │ │ ├─common.php 模块函数文件 │ │ ├─controller 控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ └─ ... 更多类库目录 │ │ │ ├─command.php 命令行工具配置文件 │ ├─common.php 公共函数文件 │ ├─config.php 公共配置文件 │ ├─route.php 路由配置文件 │ ├─tags.php 应用行为扩展定义文件 │ └─database.php 数据库配置文件 │ ├─public WEB目录(对外访问目录) │ ├─index.php 入口文件 │ ├─router.php 快速测试文件 │ └─.htaccess 用于apache的重写 │ ├─thinkphp 框架系统目录 │ ├─lang 语言文件目录 │ ├─library 框架类库目录 │ │ ├─think Think类库包目录 │ │ └─traits 系统Trait目录 │ │ │ ├─tpl 系统模板目录 │ ├─base.php 基础定义文件 │ ├─console.php 控制台入口文件 │ ├─convention.php 框架惯例配置文件 │ ├─helper.php 助手函数文件 │ ├─phpunit.xml phpunit配置文件 │ └─start.php 框架入口文件 │ ├─extend 扩展类库目录 ├─runtime 应用的运行时目录(可写,可定制) ├─vendor 第三方类库目录(Composer依赖库) ├─build.php 自动生成定义文件(参考) ├─composer.json composer 定义文件 ├─LICENSE.txt 授权说明文件 ├─README.md README 文件 ├─think 命令行入口文件
|
ThinkPHP框架特点之一是,它是单一入口的框架,这样的好处是只需要对这一个入口进行安全监测即可。框架的入口就是publc目录,下面是public目录下的index.php文件内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
define('APP_PATH', __DIR__ . '/../app/');
define('CONF_PATH',__DIR__ . '/../app/conf/');
require __DIR__ . '/../thinkphp/start.php';
|
我们可以看到在这个文件里,它定义了两个常量,'APP_PATH'是我们的应用路径、'CONF_PATH'是用于应用的配置文件,在该目录下我们可以根据需求来为应用进行配置。(ps:这个是我自己加的,我的版本是5.0.22_with_extends,好像删除了以前版本的conf目录,我还是觉得加上更好管理)
之后会加载框架的引导文件,下面是一个简单示例。这是我的目录信息:


第一张是我的thinkphp目录,和默认的是一样的。第二张是我的app目录。
首先我设立了四个模块,分别是'admin', 'common', 'conf', 'index'
。这四个模块使用的是MVC的设计模式,每个文件夹下都会有一个controller、view、model文件夹。可以简单理解为'index'是我的前端模块、admin是我的后端模块、common是公用模块、conf是我的配置模块(下一节会细说)。
如何使用这个框架呢?在index文件夹下建立controller文件夹、建立Index.php文件,文件内容如下:
1 2 3 4 5 6 7 8 9 10 11
| <?php
namespace app\index\controller;
class Index { public function hello() { echo "Hello World!"; } }
|
打开服务器,进入localhost下的public目录就会看到:
URL也能看出我访问的是public下的index模块的Index类的hello方法,输出正常。这就是一个示例了。
当然我再添加方法也可以,只需改变URL后的内容即可,如我新建了world方法,URL为http://localhost:8080/thinkphp/public/index/Index/world
即可。
同理,访问不同的模块方法亦是如此,如访问我建好的admin模块,同样改变URL即可,如:http://localhost:8080/thinkphp/public/admin/xxx/xxx
基础信息
在public目录下的index.php我们可以看到引用了thinkphp下的框架引导文件:start.php。我们看一下源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| \thinkphp\start.php
<?php
namespace think;
require __DIR__ . '/base.php';
App::run()->send();
|
步骤也很简单:加载基础文件、执行应用。我们来看看基础文件base.php的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| \thinkphp\base.php
<?php
define('THINK_VERSION', '5.0.22'); define('THINK_START_TIME', microtime(true)); define('THINK_START_MEM', memory_get_usage()); define('EXT', '.php'); define('DS', DIRECTORY_SEPARATOR); defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS); define('LIB_PATH', THINK_PATH . 'library' . DS); define('CORE_PATH', LIB_PATH . 'think' . DS); define('TRAIT_PATH', LIB_PATH . 'traits' . DS); defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS); defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS); defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS); defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS); defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS); defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS); defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS); defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS); defined('CONF_PATH') or define('CONF_PATH', APP_PATH); defined('CONF_EXT') or define('CONF_EXT', EXT); defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_');
define('IS_CLI', PHP_SAPI == 'cli' ? true : false); define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);
require CORE_PATH . 'Loader.php';
if (is_file(ROOT_PATH . '.env')) { $env = parse_ini_file(ROOT_PATH . '.env', true);
foreach ($env as $key => $val) { $name = ENV_PREFIX . strtoupper($key);
if (is_array($val)) { foreach ($val as $k => $v) { $item = $name . '_' . strtoupper($k); putenv("$item=$v"); } } else { putenv("$name=$val"); } } }
\think\Loader::register();
\think\Error::register();
\think\Config::set(include THINK_PATH . 'convention' . EXT);
|
第14到33行我们可以看出它定义了各种常量,比如thinkphp的版本信息、目录分隔符、APP路径等等,这些都是thinkphp的默认配置。如果在conf目录下重新定义、或者在public下的index.php中定义(比如我们增添的路径),都会覆盖默认的配置。
## 配置信息
这是我的app目录下的结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| │ .htaccess │ command.php │ common.php │ config.php │ database.php │ route.php │ tags.php │ ├─admin │ └─controller │ Index.php │ ├─common │ └─controller │ Index.php │ User.php │ ├─conf │ │ config.php │ │ │ ├─admin │ │ config.php │ │ │ ├─extra │ │ demo.php │ │ emails.php │ │ │ └─index │ config.php │ └─index └─controller Index.php User.php
|
其中admin、index、common、conf。四个文件夹是我建立的,前三者是单独作用的模块,common模块为公用模块。此外可以看到有一个config.php文件,这个文件是对app的通用配置,一般我们不进行更改。
我们在index模块下的Index.php中添加方法:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php
namespace app\index\controller
class Index{
public function hello() { $res = Config::get(); dump($res); }
}
|
我们Config是ThinkPHP提供的一个类(我会单独总结ThinkPHP框架学习---config类和config助手函数),这里我们使用静态方法get()来打印当前的配置信息。

可以看到返回了一个数组,内容是我们的配置信息。
配置方法
这里共有两种配置的方法:为所有模块配置、为单一模块配置。写配置的方法也很简单。
为所有模块配置
在app目录下建立文件夹conf(名字固定),在其中建立文件cofig.php(名字固定),这要在这里写的配置信息都会被加载到app的所有模块。如:

这是没有配置前index模块下的Index类中的hello方法打印出来的index模块的配置,url为:http://localhost:8080/thinkphp/public/index/Index/hello
。更改url,在其他模块中的结果也是一样的。现在,我们在conf目录下的config.php文件中写如下面内容:
1 2 3 4 5
| <?php
return [ 'author_name' => 'this is a test' ];
|
刷新页面:

可以看到多出了这一条信息。其他模块中亦是如此。
为单一模块配置
如果我们需要为指定模块做配置,只需要在conf目录下建立与模块名字相同的目录,下面增加config.php文件,在里面写我们的配置即可。这是我的conf目录:
1 2 3 4 5 6 7 8 9 10 11 12
| ─conf │ │ config.php │ │ │ ├─admin │ │ config.php │ │ │ ├─extra │ │ demo.php │ │ emails.php │ │ │ └─index │ config.php
|
我为admin和index都建立了一个config.php配置信息文件。在admin下的config.php写入:
1 2 3 4 5
| <?php
return [ 'user_id' => 'adminUserId' ];
|
在index下的config.php写入: 1 2 3 4 5
| <?php
return [ 'user_id' => 'indexUserId' ];
|
分别访问两个模块,并打印配置信息:
http://localhost:8080/thinkphp/public/admin/Index/hello

http://localhost:8080/thinkphp/public/index/Index/hello

可以看到我们对两个模块分别进行了配置。另外可以看到在conf目录下还有一个extra目录,这个目录使用来添加扩展配置的,范围可以是所有的模块,也可以是针对指定模块(建立在conf下的指定模块目录下)。
v1.5.2