学习PHP该走什么样的路线

问题 by 西秦公子

  1. 是应该看传统代码还是应该看MVC框架代码?

  2. 是应该先看手册还是应该看成品项目?

本人情况: 了解PHP的基本语法,研究过typecho的主题,了解过MVC构架。 希望可以有大神帮忙量身定制一条路线。

我的看法

  1. 不管什么风格都要看,而且别停留在看上,动手hack一下试试模仿/修改一些功能。不知道非架构代码是啥样的情况下是不容易用好/设计好架构的
  2. 你学英文(这个人又来拿英文比喻了)的时候是先看字典还是先看课文?无论怎样我觉得都不可能是我看完了一大本课文没翻字典查单词,或者是我看完了牛津字典但没看半篇文章。看起来好像后者还合理一点,套到编程上来也是一样的。

对字典(文档),可以先按照常用三千词的程度简单翻一遍(还存在你没经验不知道什么是常用的问题),但主要还是靠一边看成品项目一边翻文档,最好还能一边请项目作者请教,大致讲解一下。(等价于一边看课文一边查字典,然后同时老师讲解) 开源项目的话,找不到作者可以找各种博客文章

技能树方面其实不管什么语言应该都是一样的:

LV0 只会语法
LV1 明白怎么运作,能查Bug(不太复杂的)
LV2 有一些思路,能添加简单功能
LV3 能发现问题,优化局部的结构/性能,能搞定较复杂问题
LV4a 对架构有心得,把握宏观架构,把握整个项目的技术体系
LV4b 对指挥有心得,能指挥LV2 LV3的人,合理分配任务,规避技术风险
LV4c 对资源有心得,能从公司内/外争取LV2 LV3的人需要的各种资源
LV4d 对外交有心得,能搞定其他部门的人一起合作
LV4e 对教学有心得,能指引各种人升级加点
LV5 掌握若干LV4技能的基础上,知道怎么招聘和摆平其他LV4的能人

看出来了吧,我就是来点LV4e这个技能的熟练度的哈哈


如何理解IoC(Inversion of Control)?

问题 by WS

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吗?越简单越好

问题 by 不写代码的码农

最近打算学习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 分享

题图:万智【精研战技】

©mcfog All rights reserved.