微信号:imooc-com

介绍:慕课网是一个超酷的互联网、IT技术免费学习平台,创新的网络一站式学习、实践体验;服务及时贴心,内容专业、有趣易学。专注服务互联网工程师快速成为技术高手!

问答干货分享 | 最好用的中文PHP框架--ThinkPHP

2017-05-19 07:45 color


ThinkPHP作为为数不多的“中文PHP框架。从ThinkPHP1.0开始就备受关注,到如今已经进化到ThinkPHP5.0版本,期间收获了很多肯定。



Q
&
A


 1. ThinkPHP 要怎么学习呢?求解


Singwa讲师:您好,可以从以下几个维度来学 

1、首先您需要有PHP基础,需要了解PHP面向对象 ,mvc等基础知识 

2、学习tp的基础知识 可以从tp官网的文档入手,里面有一些基础的用法,边看边去操作,这样有利于加深理解,最基本的知识点比如入口文件,配置文件,控制器、模型、视图层、基础类库,helper.php里面的公用方法等等,这些最基本的需要掌握。 

3、做一套tp的实战项目 这样才能将实战项目和框架紧密联系在一起,有利于您深入学习TP 

4、tp的进阶就是需要您通读tp里面的源码。




 2.现在PHP的开发,都需要会这个thinkPHP吗?目前企业人才招聘有硬性要求这项吗


Singwa讲师:您好,其实我个人认为框架只是一个工具,学好一个就行,因为框架的基本思想都差不多,万变不离其宗,等你学好了一个,你学习其他的就会很快。 在国内的话thinkphp用的还是挺多的,企业招聘也不完全硬性要求这项,建议学习框架的时候一定要去学习框架的思想,多去读他里面的源码,这有利于您的理解。




3.我在学习课程时,在使用Uploadfidy插件,老是出现路径不对的问题,不太了解Tp5路由,请问是不是和我报错有关系呢?

thinkphp与其他框架的优势是什么呢?


Singwa讲师是不是提示你抛送的接口404呢? 一般这种情况您需要先定位到浏览器中接口返回的内容是什么,在response模块,tp5提示404有两个情况,第一:确实不存在这个地址

第二:这个接口内部有错误 如果是第一个情况那么我们需要排查是不是文件名新建错了等,如果是第二个情况,那么我们就需要根据错误提示来排查了,具体排查需要根据您的错误提示来。 关于thinkphp和其他框架的优势,我个人认为tp在国内很多年了,并且有很大的用户群体,也特别的成熟,文档也非常多,关键一点是tp容易学,非常容易上手,开发效率也特别的高。 最后㊗️您学习愉快。




4.框架对原生PHP改变太大,久了之后就不会原生了,咋办啊


Singwa讲师框架的本质是为了快速开发,用框架你不能局限的停留在会用的阶段,您还应该要去理解,怎么说呢?比如你使用tp5的input方法,你看看文档就会使用,但是我们需要理解input方法的工作原理,这个时候就需要您阅读他的源码了,同样的道理其他的也一样,所以要想学好一门框架必须要通读里面的源码,看看框架的工作原理以及核心,这样您才能够更好的理解框架,并且您也可以优化框架本身的内容,所以这样您就不会产生不会原生的了




5.tp5足以应对高并发吗?如电商的抢购、双十一活动这些,这些场景的代码要从什么角度考虑去写呢?


Singwa讲师您好,高并发的处理基本是靠服务器来处理的,比如做负载均衡,数据库层做分布式处理,当然这是个大体的方向,具体细节还需要根据自身的业务来定,但是一个原则PHP层代码的话也是需要考虑一些性能的,比如PHP查询数据的时候需要做到性能上的高效。当然还有缓存、队列场景的使用。具体要看场景。




6.能不能讲解tp5和其他版本的最大的区别?


Singwa讲师您好,我主要讲解tp5和tp3的一些区别,如下 

一、控制器 1、tp5控制器的类名默认不携带了Controller后缀,tp3需要携带Controller后缀 2、tp5控制器的方法中用return返回内容

 二、函数 1、tp5单字母函数废弃了,比如C M D方法,默认系统加载助手(helper.php)函数 。 

三、默认返回值 1、tp5模型查询的时候返回默认是个‘对象’,系统默认增加了'toArray'方法来转换。 

四、数据库 1、tp5的数据库查询功能非常强大,tp3需要通过模型才能使用的链式查询,现在tp5可以直接通过Db类调用,原来的M函数调用可以改用db函数 等 2、tp5的模型查询增加了静态方法 

五、异常 1、tp5对错误级别是零容忍,默认情况下会对任何级别的错误抛出异常,当然新版本重新设计了异常页面,页面也比之前好看多了,展示了详尽的错误信息,便于调试,非常方便

 六、tp5完全支持惰性加载,这点性能较比之前好多了。 当然还有很多不一样的地方,您可以查阅tp5的源码看看。最后㊗️您学习愉快




7.tp5在缓存上的支持怎么样 如何能在这个框架的基础上完成队列机制?


Singwa讲师您好,静态缓存(生成在runtime里面的静态文件)在tp5中可以使用助手函数cache来操作,但如果需要使用更高级的缓存的话,比如redis,这个时候需要我们在服务器中安装redis的服务,然后开启扩展(window:redis.dll, linux:redis.so),并且还需要写一个PHP操作redis的类库文件放入tp5中,这样我们才能方便和高效的使用redis缓存。 关于队列的话也是需要我们学一套服务的,比如rabbitmq或者kafka,同理也需要我们安装这个服务,就拿rabbitmq来说,我们先在服务器上安装rabbitmq, 然后官网提供了PHP操作rabbitmq的类库,我们可以把这种类库放入tp5的extends目录下,当然需要修改为适配TP5的类库文件, 这样我们就可以操作队列了。




8.很喜欢你的课程,请问我们这种小白如何快速的成为技术牛人呢。?希望给我一些建议


Singwa讲师首先多谢您支持我的课程! 关于如何快速成为技术牛人?这个是需要时间的积累的,不能一撮而就的,我认为您可以从以下几点做好准备工作:


 第一:熟练掌握PHP的基础知识


 第二:学好一个框架,比如thinkphp YII等,切记一定要熟练的掌握一个框架,要非常清楚的理解框架的原理,核心。那么这方面如何去学习呢? 1、先看看框架的文档,然后边看边去操作;2、通过框架做一个实战的项目,如果前期没有项目经验的可以看看慕课网的实战课程, 3、在实战完成后,要多去看看框架的源码,这有利于您理解框架的思想,这个是很有必要去学的,在这过程当中你会对PHP有更高的认知,对你的技术当然是一个质的飞跃,前提是你需要坚持 


第三:到公司后 才是您技术提升的关键因素,这个时候你必须要多去做一些项目,在项目中发现自己的不足,并且快速的去补充自己的知识,当然不能只是为了完成项目的功能,我们需要不断的挖掘新的技术方案,什么方案适合当前的项目,并且能够做到更好的优化项目的性能,这个过程当前您会成长很多 


第四:多和公司的技术牛人沟通技术,从他们身上学到核心技术,这比你自学要快很多,因为有个引路人比什么都重要。 第五:到公司后建议 学习的技术有: 1、MySQL数据库优化 2、nosql知识 比如:redis mc mongodb等 3、消息队列服务:如rabbitmq kafka等 4、第三方搜索引擎服务:如elasticsearch, sphinx等 5、分布式 、负载均衡 等等 




9.谈下tp单元测试这块


Singwa讲师您好,tp5的单元测试需要依赖很多库首先你需要下载这些依赖的类库文件,可以通过composer安装,命令如下: composer require topthink/think-testing,这个时候在根目录会多了一个tests目录,那么可以在这个目录下编写您的单元测试文件,您可以新建一个测试用例类 在tests目录下新建一个IndexTest.php的测试用例类,并在其中键入一下的代码: <?php namespace tests; class IndexTest extends TestCase { public function testTest() { $this->visit('/index/index/test')->see('test singwa'); } } 该用例是继承tp5单元测试扩展类TestCase的。它提供了多个用于支持tp进行单元测试的方法。如visit方法是接受一个作为URI的参数模拟向TP框架中的某个测试发起请求。而see方法则是断言输出的结果是否符合一个正则表达式,其中第一个参数为要匹配的正则表达式,第二个参数的值为true时断言正则表达式不出现在结果中,为false时断言正则表达式出现在结果中,默认为false。 然后在根目录下执行命令:php think unit 再看看控制台的运行结果: 在结果的最后一行中,显示OK,说明所有的测试用例都测试通过了。


 


10. tp5路由分发原理 


Singwa讲师1、thinkphp5中一个典型的URL请求的执行过程大致如下:


用户请求 -> 路由解析 -> 调度请求 -> 执行操作 -> 响应输出


2、路由在框架中的作用打个比方的话,路由好比是WEB应用的总调度室,对于访问的URL地址,路由可以拒绝或者接受某个URL请求,并进行分发调度,而且还有一个副作用是因为路由规则可以随意定义,因此可以让你的URL请求地址更优雅,因为不会暴露实际的URL地址,也就意味着更安全,5.0的路由不仅仅只是支持路由到控制器的操作方法,甚至可以路由到任何的类或者闭包。

3、那么我们来分析下路由内部做了哪些事情,还是列举一个简单的例子

url请求过来会执行 App类里面的run方法,这个方法中tp5会去检测路由,也就是routeCheck方法,这个方法会去加载application应有目录下的route.php,这个文件其实就是我们自定义的一些路由规则 , 然后再通过tp内置的Route类库批量注册路由, 比如如果我们在route.php里面注册了这么一个路由信

'test' => 'index/index/test' (备注:比如我们访问xxx.com/test 实际上他是定位到xxx.com/index/index/test) 那么这些信息就会被Route基础类库注册到路由中,之后需要做的路由检测(根据路由定义返回不同的URL调度),这个时候需要分2种情况 ,第一种情况:检测后有值(备注:比如这种地址xxx.com/test的访问) 第二种情况:无内容、这说明当前的url请求不在自定义的路由配置中(比如最简单的xxx.com/index/index/index这个地址的访问),那么这个时候会执行Route::parseUrl这个解析,但是不管怎么样这两种情况的结果返回的都是如下格式:


Array
(
    [type] => module    #类型  tp5中有好几种 具体几个类型可以参考App类里面的exec方法
    [module] => Array
        (
            [0] => xxx  #模块
            [1] => xxx  #控制器
            [2] => xx   #方法
        )


)


4、接下来会根据上面返回的内容 来记录当前调度信息,然后会去执行app类里面的

exec方法,我们已type=module来举例, 之后就会去执行App类里面的module(执行模块方法)、大致就这么回事


案例分析:
我们用一个URL请求案例来体验下路由的使用,定义一个控制器类命名为application/index/controller/Index.php:

namespace app\index\controller;

class Index
{
    public function test()
    {
        return 'hello-test' ;
    }
}
要访问Index控制器的test操作方法的话,没有定义路由规则之前,访问的URL地址应该是:http://xxx.com/index/index/test


访问后浏览器输出结果为:

hello-test
下面我们来定义一个路由:
在application目录下的route.php中加入:'test' => 'index/index/test'
,

定义后,我们就可以直接访问下面的地址:http://xxx.com/test  访问后浏览器输出结果和之前是一样的。



讲师介绍

Singwa讲师BAT界PHP资深工程师。拥有丰富的大数据、高并发处理、大型网站架构经验。曾在新浪视频负责PHP开发,CCTV6电影网项目经理,现在某大型知名互联网公司负责大数据流的开发。讲课风格激情澎湃,认真负责。


讲师相关教程推荐

点击下图,即可查看





新一期花式填坑来了

话题是“ 如何成为合格的Java架构师 ” 

戳下方图片 或 阅读原文

抢先一步,与BAT大咖共同探讨吧




长按二维码
即可关注我们

慕课网

 程序员的梦工厂 

更多技术干货

   等你来解锁!



 
慕课网 更多文章 2小时搞定移动直播App开发 开始学习 4 年前端狗,2 年 CTO,一个程序员六年的奋斗史 教师节,老师竟然送你礼物!(9.10日,不限名额!!!) 【慕课网实战课】从0开始双剑合璧Laravel,AngularJS全栈开发知乎 五功大成!慕课网安卓5.0客户端重磅发布!
猜您喜欢 刷脸时代!支付宝“刷脸支付”的11个漏洞! 携程Android App插件化和动态加载实践 如何手动给Docker容器添加静态IP 2016第五届iWeb峰会城市巡回深圳站 荣耀开启 敏捷破冰之旅(四)