ThinkPHP5.1入门


===================================
Composer的官方网站:
https://www.phpcomposer.com/
=======================================
Composer的简介:
Composer是PHP用来管理依赖关系的工具。
可以在自己的项目中声明所依赖的外部工具库,
Composer会帮你安装这些依赖的库文件。
=====================================
Composer安装中国全局镜像可以大幅提升国内访问速度。
修改 composer 的全局配置文件:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
===========================================
composer官网有个【安装包列表】,可以找到要下载的安装包。
https://packagist.org/。
然后搜索thinkphp的安装包,输入:topthink。
找到第一个就是,下载命令:
composer create-project topthink/think 项目名称。
=======================================
thinkphp5的入口访问文件是public下的index.php
==============================================
tp5的基本运行流程:
浏览器-->入口文件index.php-->启动脚本start.php-->基础配置base.php
-->自动加载Loader.php-->接收请求Request.php-->返回响应Response.php。
=================================================
tp5.1的配置
相比tp5.0:
1、用config目录取代了config.php文件;
2、一级配置名称就是配置文件的的名称;
3、路由配置route.php完全独立出来了;
4、模块配置与应用配置完全独立不再合并。
=====================================================
tp5的模块名字、控制器的目录名字都是小写;
控制器名字首字母大写,相比tp3.2,命名不需要.class。
tp5的命名空间需要把写三级,即app\模块名字\controller;
tp3.2的命名空间写两级,即模块名字\Controller。
===============================================
获取config的配置项:
配置文件在thinkphp\library\think\Config.php。
而thinkphp\library\think\facade\Config.php把配置项都转成了
静态方式访问。
在控制器中获取配置项:
use think\facade\Config;

//获取所有配置项
dump(Config::get());//获取所有配置项

//获取一级配置项
dump(Config::get('app.'));//获取app文件里的配置项
dump(Config::get('database.'));//获取database文件里的配置项
或者
dump(Config::pull('database');

获取二级配置项(app是默认的一级配置项前缀,可以省略,其他不可以):
dump(Config::get('database.type'));//获取database文件里的配置项数据库类型。

查询配置项是否存在:
dump(Config::has('database.type'));

动态设置配置文件
Config::set('app_debug',true);
================================================
使用助手函数Config(),不依赖Config类,
即不需要使用use think\facade\Config。
//获取所有配置项
dump(config());
//获取一级配置项
dump(config('database.'));
//获取二级配置项
dump(config('database.type'));
//判断配置项是否存在,使用问号
dump(config('?database.type'));
设置配置项
config('database.hostname','localhost');
===================================================
Trait介绍:
自PHP5.4起,PHP实现了一种代码复用的方法,称为trait。
Trait是为类似PHP的单继承语言二准备的一种代码复用机制。
Trait为了减少单继承语言的限制,使开发人员能够自由地在不同
层次结构内独立的类中复用method。
=======================================================
trait实现了代码的复用,突破了单继承的限制;
trait是类,但是不能实例化。
示例:
trait Demo1{
public function hello1(){
return __METHOD__;
}
}
trait Demo2{
public function hello2(){
return __METHOD__;
}
}

class Demo{
use Demo1,Demo2;//继承Demo1和Demo2

public function hello(){
return __METHOD__;
}

public function test1(){
//调用Demo1的方法
return $this->hello1();
}
public function test2(){
//调用Demo2的方法
return $this->hello2();
}
}

$cls = new Demo();
echo $cls->hello();
echo $cls->test1();
echo $cls->test2();

优先级问题:
当当前类和父类、trait类的方法重名后,
当前类>trait>父类。
当多个trait类重名后,就会报错,需要额外处理:
use Demo1,Demo2{
//Demo1的hello替换Demo2的hello方法
Demo1::hello insteadof Demo2;
//Demo2的hello起别名
Demo2::hello as Demo2Hello;
}
================================================
容器(注册树)和依赖注入
容器用来更方便地管理类依赖即运行依赖注入。
容器用来进行类管理,还可以将类的实例(对象)作为参数,
传递给类方法,自动触发依赖注入;
依赖注入:将对象类型的数据,以参数的方式传递到方法的参数列表。
public function getMethod(\app\home\Index $index){

}
参数\app\home\Index $index相当于$index=new \app\home\Index;
会触发依赖注入。
依赖注入是实例化对象参数的技术。
====================================================
容器:
把一个类放到容器中:
\think\Container::set('temp','\app\home\Index');
//使用助手函数bind('temp','\app\home\Index');

$temp = \think\Container::get(abstract:'temp',['param1'=>'123']);
//或者使用助手函数app('temp',['param1'=>'123']);

return $temp->getName();

把一个闭包Closure放到容器(闭包可以理解为匿名函数)
\think\Container::set('temp',function($domain){
return 'PHP'.$domain;
});

return \think\Container::get('temp',['domain'=>'123']);
=========================================================
Facede门面,门面为容器中的类提供了一个静态调用的接口,相比于传统
的静态方法调用,带来了更好的可测试性和扩展性,可为任何的非静态类库
定义一个facade类。
想要静态方式访问一个动态方法,就需要给当前类绑定一个静态代理的类。
静态代理类就是think\facade.php。
class Test extends \think\Facade{
protected static function getFacadeClass(){
return 'think\Myself';//要代理的类
}
}
动态绑定:
\think\Facade::bind('app\home\Test','think\Myself');
===============================================================
tp5正常情况下,控制器不依赖父类Controller.php;
推荐继承父类,可以很方便的使用在父类中封装好的方法和属性;
Controller.php没有静态代理;
控制器的输出,字符串用return;复杂类型用dump();
==============================================================
Request请求:
方法一(直接实例化Request类):
$request = new \think\Request();
dump($request->get());

方法二(使用facade静态代理):
$request = new \think\facade\Request();
dump($request::get());//这样可以静态调用动态方法

方法三(依赖注入Request $request):
use think\Request;
public function test(Request $reques){
dump($request->get());
}

方法四(继承Controller类):
class Test extends \think\Controller{
public function demo(){
dump($this->request->get());
}
}
===============================================================
连接数据库:

方法一(使用全局配置config/database.php):
Db::table('user')->where('id',1)->value('name');

方法二(动态链接数据库):
Db::connect([
'type'=>'msyql',
'hostname'=>'localhost',
'database'=>'demo',
'username'=>'root',
'password'=>'123456',
])->table('user')->where('id',1)->value('name');

方法三(DSN连接):
$dsn = 'mysql://root:123456@localhost:3306/demo#utf8';
Db::connect($dsn)->table('user')->where('id',1)->value('name');
==============================================================
config目录下的配置文件:
如果要指定一个模块的配置文件,可以在config目录下,创建一个和模块
名字相同的目录,在目录下写一个配置文件,
示例:
默认config目录下有个database.php的全局数据库配置文件,
如果在config目录下新建一个index\database.php,这个数据库配置文件
就只对index模块有效。
=============================================================
数据库操作:
find(),单条查询,查询不到返回null;
findOrEmpty(),单条查询,查询不到返回空数组;
field(),指定返回的字段;
table(),选择数据表;
select(),返回多条数据;
where(),查询条件,示例where([['course','=','php'],['grade','>=',80]]);
value(),返回个字段,单个值。
column(),返回某一列的值。
column('name','id'),返回name列的值,并以id为索引。
insert(),添加一条数据;
Db::table('user')->data($add_data)->insert();
返回新增id:
Db::table('user')->data($add_data)->insertGetId();
insertAll(),插入多条数据。
update(),更新操作,必须有where条件。
delete(),删除操作。
原生sql,使用query()查询和execute()更新添加删除;
$sql = "select id,name from user";
Db::query($sql);
======================================================================
模型是和数据表绑定的,
use app\index\model\User;
User::get(1);//获取id为1的数据。
User::field('id,name')->where('id',9)->find();
User::all();//获取多条记录
=================================================================
模板赋值与变量输出
$content='PHP CSS';
return $this->display($content);
使用view();
return $this->view->display($content);//$this->view是controller的方法。
或者
use think\facade\View;
return View::display($content);

//使用视图将数据进行输出fetch():
$this->view->assign('name','zhang san');//赋值
$this->view->assign(['name'=>'zhang san','age'=>2]);//批量赋值
return $this->view()->fetch();
模板中使用传递的变量:
{$name}
{//这是注释}
{$order.id}
{$order['id']}
==========================================
创建对象
$obj = new \stdClass();
$obj->id = 1;
$obj->name = 'PHP';
$this->view->assign('info',$obj);//批量赋值
return $this->view()->fetch();
模板中使用:
{$info->id}
=================================
模板中使用常量:
{$Think.const.SITE_NAME}
{$Think.const.PHP_VERSION}
模板中使用系统变量:
{$Think.server.php_self}
{$Think.server.session.id}
{$Think.server.get.id}
模板中获取配置:
{$Think.config.database.hostname}
获取请求变量
{$Request.get.name}

{$Request.path}
{$Request.root} //值为/index.php
{$Request.root.true} //值为http://localhost/index.php
==================================================================
laravel中的take相当于limit();
==================================================================

ThinkPHP5.1入门的更多相关文章

  1. ThinkPHP5 快速入门文档

    一. 5.0版本采用模块化的设计架构,默认的应用目录下面只有一个index模块目录,如果我要添加新的模块可以使用控制台命令来生成. 切换到命令行模式下,进入到应用根目录并执行如下指令: php thi ...

  2. ThinkPHP5 的入门学习

    与Tp3.2相比,有一下的不同: (1)目录名称的改变: tp3.2的目录命名首字母皆为大写,例如:Application.Public.Controller.Model.View.ThinkPHP. ...

  3. ThinkPHP5项目目录

    ThinkPHP5安装后(或者下载后的压缩文件解压后)可以看到下面的目录结构: tp5├─application     应用目录 ├─extend          扩展类库目录(可定义) ├─pu ...

  4. thinkphp5在URL地址里隐藏模块名

    新的Thinkphp5的路由功能很强大,完全可以自定义以满足自己的要求   ThinkPHP5.0的路由规则如下:http://serverName/index.php/module/controll ...

  5. ThinkPHP5项目目录规划实践

    ThinkPHP5安装后(或者下载后的压缩文件解压后)可以看到下面的目录结构: tp5├─application     应用目录 ├─extend          扩展类库目录(可定义) ├─pu ...

  6. ThinkPHP5.0、5.1和6.0教程文档合集(免费下载)

    我们都知道ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架. ThinkPHP6主要更新了什么呢? 1. 支持PHP最新的强类型 2. PSR开发规范得了更广泛的应用 3. ...

  7. wamp设置自定义域名访问php网站

    wamp是一个在window系统下很不错的php开发套件,一般我都是使用此套件在本地进行开发和测试的 特别是alias功能特别好,可以同时开发N个php网站而不互相影响 但alias有一个问题,它其实 ...

  8. TP3.2.x判断手机端访问并设置默认访问模块的方法 - ThinkPHP框架

    手机端访问时调用Wap手机模块,实现在手机端访问时展示出手机网站,无需跳转域名首先我们在./Application/Common/Conf/ 目录下建立两个公共配置文件:config.php 和con ...

  9. 《Thinkphp5使用Socket服务》 入门篇

    上车啦!!! 今天来说一下thinkphp5.0下使用wokerman的socket服务. 安装: composer的安装方法,Windows下直接下个composer的应用程序,双击安装,环境变量同 ...

随机推荐

  1. jpeg和jpg的区别是什么

    JPG是JPEG的简写,jpg是后缀名,jpeg既可作为后缀名,又能代表文件格式:JPG——JPEG文件格式. 我们在系统自带的画图程序里保存文件,在保存类型:JPEG(*.JPG,*.JPEG,*. ...

  2. 如何让升级时AppleHDA不再折腾

    ---前提--- 1. 你得用 Clover 引导 (......) 2. 开启 kernelcache (开了也能 inject kext,还能patch kext,速度又快,为啥不开) 3. 你的 ...

  3. 初涉k-d tree

    听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...

  4. [CODEVS] 3955 最长严格上升子序列(加强版)

    题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. <abk,其中b1<b2<..bk. 输出长度即可. ...

  5. 十:MYSQL中的事务

    前言: 因为没有多少时间和精力,目前无法深入研究数据库中的事务,比如 但是,对于事务的一些基本知识,还是需要牢牢掌握的,做到了解事务的基本常识,在实际开发中能够理解各个持久层框架对事务的处理 一:是么 ...

  6. proto_ops和proto区别

    **proto_ops:**该结构体包含了某个特定的"protocol family"的一系列functions. 其包含的functions和struct proto很类似,但是 ...

  7. react事件代理

    参考:https://github.com/youngwind/blog/issues/107 首先回顾以下原生事件的两个方法:event.stopImmediatePropagation 和 eve ...

  8. 关于reg的思考

    对于用于always中的标识符一般声明其数据类型为reg,但不一定都是代表触发器. 1.always中组合逻辑.reg跟时序无关. 2.alwasy中时序逻辑.reg表示触发器. 对于组合逻辑设计 1 ...

  9. ZZULIoj 1913: 小火山的计算能力

    Description 别人说小火山的计算能力不行,小火山很生气,于是他想证明自己,现在有一个表达式,他想计算出来. Input 首先是一个t(1<=20)表示测试组数.然后一个表达式,表达式长 ...

  10. ASP.NET MVC中如何在当前页面上弹出另外一个页面

    注意:不是链接到另一个页面,而是弹出一个页面,当前的页面和弹出页面都存在于浏览器的同一个标签页中,效果如图: 弹出的窗体置于四大天王页面之上,但是无法继续操作底层的页面,代码如下: function ...