学习PHP该走什么样的路线
是应该看传统代码还是应该看MVC框架代码?
是应该先看手册还是应该看成品项目?
本人情况: 了解PHP的基本语法,研究过typecho的主题,了解过MVC构架。 希望可以有大神帮忙量身定制一条路线。
我的看法
- 不管什么风格都要看,而且别停留在看上,动手hack一下试试模仿/修改一些功能。不知道非架构代码是啥样的情况下是不容易用好/设计好架构的
- 你学英文(这个人又来拿英文比喻了)的时候是先看字典还是先看课文?无论怎样我觉得都不可能是我看完了一大本课文没翻字典查单词,或者是我看完了牛津字典但没看半篇文章。看起来好像后者还合理一点,套到编程上来也是一样的。
对字典(文档),可以先按照常用三千词的程度简单翻一遍(还存在你没经验不知道什么是常用的问题),但主要还是靠一边看成品项目一边翻文档,最好还能一边请项目作者请教,大致讲解一下。(等价于一边看课文一边查字典,然后同时老师讲解) 开源项目的话,找不到作者可以找各种博客文章
技能树方面其实不管什么语言应该都是一样的:
LV0 只会语法
LV1 明白怎么运作,能查Bug(不太复杂的)
LV2 有一些思路,能添加简单功能
LV3 能发现问题,优化局部的结构/性能,能搞定较复杂问题
LV4a 对架构有心得,把握宏观架构,把握整个项目的技术体系
LV4b 对指挥有心得,能指挥LV2 LV3的人,合理分配任务,规避技术风险
LV4c 对资源有心得,能从公司内/外争取LV2 LV3的人需要的各种资源
LV4d 对外交有心得,能搞定其他部门的人一起合作
LV4e 对教学有心得,能指引各种人升级加点
LV5 掌握若干LV4技能的基础上,知道怎么招聘和摆平其他LV4的能人
看出来了吧,我就是来点LV4e这个技能的熟练度的哈哈
如何理解IoC(Inversion of Control)?
RT,如何理解IoC(Inversion of Control)?如果能写个demo解释最好了。
我的看法
我试着搜了一下,中文资料基本都把IoC(控制翻转)和DI(依赖注入)混为一谈,就连StackOverflow上的第一位答案也犯了同样的问题(幸好下面有高票的反对评论,否则我的世界观都快坏掉了)
控制翻转是代码复用的一种模式(注意不是设计模式)
一般(非IoC)的复用,通常是用户代码调用组件(任意形式的被复用的代码,本答案中统称为组件)。也就是用户代码解决“Why it works, What to do”,组件解决“How to do”,逻辑的入口是用户代码,
而控制翻转则是组件来调用用户代码,也就是组件解决“Why it works, When to do”,用户代码解决“What to do”,逻辑的入口是组件
下面是除了DI之外的控制翻转的例子
- 接口/虚函数 组件调用接口/虚函数,具体由用户代码实现
- 发布订阅(事件)模式 组件触发事件,用户代码订阅事件
- 回调 用户代码写回调,组件来调用
- 几乎所有能被称之为框架的东西 用户代码在规定的地方实现具体业务逻辑,剩下的框架负责
能简单解释一下MVC吗?越简单越好
最近打算学习PHP框架,才发现我以前对MVC的认识很肤浅。但是看Laravel的文档,对MVC又是云里雾里的
我的看法
概念大家都说了,其实MVC的涵义一直在潜移默化地变化,原本CS软件的MVC和如今php ruby python讲的MVC已经有不小的区别了。甚至很可能概念早就变成MVP,只是大家习惯了MVC,指鹿为马了
我觉得已实际项目来说,作3个思想实验就能大致理解MVC的本质和目标,具体三层怎么分,是三层还是四层还是两层,其实都是为了达成灵活性和可维护性的手段而已
更换数据库选择
数据结构不变,把数据库从mysql迁移到pgsql乃至mongodb,你的项目需要多大的变化? 理想的MVC架构应该无需修改任何业务代码(包括Model),只需要修改配置文件,最多写个新的DBAL driver 实际情况下不同DB的能力有微妙的区别,那也应该微调Model就能解决。
如果你的答案是两眼一黑:和重写一遍差不多,那么你的M层还不够独立,该写在Model的代码分散到别处了
手机HTML5版本
假设保持所有功能不变(都有合理自然的移动版交互),给你的站点增加手机版,你的项目需要多大的变化?
答案应该是重写一套View,然后Controller改一行if(isMobile) use(MobileView);
如果你发现Controller要改大量逻辑,甚至Model都被牵连,那你的V层不够独立
增加API
假设所有功能不变,给你的站点增加开放API(给第三方或移动应用使用),你的项目需要多大的变化? 答案应该是一套新的Controller 包含新的授权、和数据格式以及校验等逻辑,和一个简单的View(只输出json或xml)
如果你发现Model要改,原来View里的一些东西要挪动,或者是原来写在老的Controller里的部分代码要copy一遍,那么你的C层不够独立
这是我在 SegmentFault 上的问题回答选编,遵循CC BY-SA 3.0 CN 分享
题图:万智【精研战技】