作者GALINE (天真可爱CQD)
看板PHP
标题[闲聊] 新手学 PHP 不要从 Laravel 开始
时间Mon Jul 3 13:44:23 2017
这是前天晚上在 LaravelConf 跟人聊到的,不熟写程式的人应该怎麽学 PHP 网站开发
重新整理一下贴上来
这年头的高大上 PHP 网站开发其实要掌握的技能相当多
- 会用 composer
- 搞懂 MVC
- 搞懂 autoloading,或至少知道 autoloading
- 有能力写物件导向程式
- 要会资料库
- 要会 html/css/js[B
- 要搞定 web server
- 最重要的,会写 PHP
这些项目每一个对於白纸等级的新手来说都是一堵高墙
尤其是,整份 PHP 现代工程都是叠在 OOP 上面,这并不是大部分新手三个月就能掌握的东西
如果直接叫白纸新手从 Laravel framework 开始,那等於是把小学生丢去打天下第一武道会
就算形式学起来了,那也只是不明就里
从这个角度来说,我认为那些古代 PHP 写法可能更适合纯粹新手上手
在学习 OOP 之前,先让他学会
<h1>你好,<?=$_GET['name']?></h1>
从这边开始,渐渐长出一堆面条一般交叠的 html 跟 php 之後
再让他看到逻辑跟 html 可以分开
<?php
$name = isset($_GET['name']) ? $_GET['name'] : "无名氏";
// 三百行逻辑
?>
<h1>你好,<?=$name?></h1>
<!-- 三百行 html -->
这样新手不但能看懂你教了什麽,又能在一瞬间理解「逻辑跟呈现分开很重要」
等到这种等级熟悉了,然後可以开始专心教 namespace/autoloading/class 这些东西
或是带入 template engine
更甚至, PHP 在 cli 上面也是充分好用的工具
撇开网页不管,PHP 就是个 scripting language
所以我在想,甚至根本可以(甚至是应该)把「网页」跟「PHP」分开来教
印星星也好,印圣诞树也好,掌握写程式跟掌握网站开发那一大包根本可以分开处理。
没有必要绑架起来放在一起。
人家怎麽学 python,就教新手怎麽学 PHP
这年头一堆人推崇 python 写工具管系统做爬虫,但是有什麽是 python 能做 PHP 却不能做的吗?
没有,我照样可以用 PHP 爬 Log 写 git hook 甚至写爬虫抓档案
新版 PHP 的效能还比 python 好(虽然这通常不重要,通常)
而且比起 python,PHP 有个压倒性的好处
PHP 有大括号
--
不可以!那是黑鹰族的精神象徵!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.122.205
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1499060668.A.A32.html
1F:→ bibo9901: PHP语言本身就一堆问题, 愈修愈烂而已 07/03 14:15
2F:→ GALINE: 也没糟到那麽不堪用... 07/03 14:54
3F:推 newton2009: 不管黑猫、白猫,能抓到老鼠的就是好猫。 07/03 15:58
4F:推 crossdunk: 有一堆问题吗,用起来感觉还好 07/03 16:17
5F:→ crossdunk: Laravel本来就是PHP有一定程度才会开始学的吧 07/03 16:17
6F:→ swallowcc: 不只是Laravel吧, framework都是, 刚开始还是native吧 07/03 16:36
7F:推 y2468101216: php有一件一定要用extension才能做的事情,异步处理 07/03 16:52
8F:→ y2468101216: 。 07/03 16:52
9F:→ GALINE: 其实不是不行,php可以fork...但确实很难用......... 07/03 17:56
10F:推 lambo: 我觉得php的好处就是网页很便利阿, python网页都MVC... 07/03 20:48
11F:推 fri13: 看得懂签名档应该有一定年纪了 你好我是坐你对面的泳裤XD 07/03 21:20
12F:→ MOONRAKER: 一楼写一下一堆是哪一堆 至少要写500字 谢谢 07/04 11:01
我来写好了,我很爱 PHP ,但我清楚明白接受 PHP 有很多缺陷
- array 系列 function 不查文件永远不知道谁该在前面谁该在後面。
- 对於多 byte 字串的支援要另外处理
(不能用str*要用mb*,非英文使用者表示靠北)
- 一般来说依照 namespace 自动载入档案是语言特性,Java 如此 python 如此
只有 PHP 还得自己写。大家用 composer 有很大一部分是因为不用自己写
符合规范的 autoloader...
- 自动转型就是会给你惊喜(这点 js 也差不多)
而且有时候不需要用到两个等号,而是放进 function 参数就会出事
- PHP 对於 namespace 下的 function 没有好的自动载入方案
- 非同步/多 Process 写起来是一屁股痛,fork是相当原始粗暴的做法
自干 fork 没写出 fork bomb 把系统弄烂者,几稀矣。
- PHP 自己就是个 template engine [by Rasmus],但是为了让 code 乾净好读
你通常会想引入写在 template engine 里面的 template engine,简直是梦中梦...
- 上面有几点很可能为了相容性而永远不会修掉。
好吧我对 PHP 的爱可能有点太多,写不到五百字...
但就算问题这麽多,他能做的事情并不比 python 与 ruby 少
有好好规划的话 code 也不会难看到哪里。
大家还在用 python 说穿了就是因为 Google 喜欢 python 的人很多...
光 Tensorflow 就不知道增加了多少 python 使用者
PHP 因为 Facebook 力挺(虽然不知道还有几年),所以也还不会太糟
Ruby 後面没有大公司撑腰,只能凋零了。
另,虽然我常常靠北 Python,但我其实也不觉得 python 比 PHP 差(当然的)
我只是觉得 PHP 有了 composer 跟 phar 之後这明明可以跟 python 平起平坐...
13F:→ MOONRAKER: Laravel的确复杂到不适合当教学工具 07/04 11:02
14F:→ MOONRAKER: 适合production用的东东不一定适合教学 07/04 11:22
我觉得光是 namespace 跟 class 的概念就不适合当新手村任务了。
其实看板上的文章有时候也会这种感觉。明显看起来就是不太会写程式的新人
拿着(有点老的)书上的范例来问,然後换来「千万不要这样写」的回答
作为工作,我举双手赞同。
但是作为学习,我总觉得那些「应该这样写」的东西新人吃得下去也是很厉害
15F:推 newversion: FB: 我们用烂语言,也能称霸那麽久 XD 07/04 11:58
16F:推 tkdmaf: 总是有一些人,自己技术烂,掌握不好东西……就怪人家 07/04 12:20
17F:→ tkdmaf: 问题多多……结果根本就自己问题多多。 07/04 12:20
18F:推 rickysu: 其实PHP在这几年有相当大的变革,从语法到VM本身 07/04 13:47
19F:→ rickysu: 如果真的要说烂,应该没有人会说 JS 是个好语言。 07/04 13:48
我觉得要挑出不好的地方很容易
更何况 Personal Home Page 工具包(笑)一开始根本不是个语言
但有就算很多缺点,他还是可以做出 Facebook、KKBOX、或 Gameboy 模拟器。
很多缺点跟他不好用根本是两个独立命题
20F:→ tkdmaf: 其实namespace和class并没有那麽难懂…… 07/04 13:49
21F:→ tkdmaf: 但我比较常看到不懂的人说他难…… 07/04 13:49
骑脚踏车也不难,但是在我会骑脚踏车以前那对我难到靠北边
我觉得一样的意思
22F:→ rickysu: 可是JS却是个不能忽略掉的东西阿。 07/04 13:49
23F:→ tkdmaf: 以前有遇过,叫人不要写class的家伙是因为自己不会 07/04 13:50
我觉得不是「不要写 Class」
这年头不分 class 不用 namespace 不太容易写出能维护的 code
不是做不到,但能做到的不多而且一定是老手
但是 class / namespace 这是否是好的新手村任务,我怀疑。
我认为这至少是新手村毕业任务甚至是一转任务之类的...
※ 编辑: GALINE (60.248.122.205), 07/04/2017 13:55:56
24F:→ tkdmaf: 如果把class直接列入必学基础呢?像学java那样…… 07/04 13:56
25F:→ tkdmaf: 不光说java,其他的物件导向语言似乎没人在吵要写不要这 07/04 13:57
26F:→ tkdmaf: 种问题了……我们乾脆就直接想成class是必经门槛就好了 07/04 13:57
27F:→ GALINE: 如果「同时」学html跟server设定,我觉得那份量相当多 07/04 13:57
28F:→ GALINE: 所以我後面认为直接把PHP独立成一个项目学 07/04 13:57
29F:→ GALINE: python也要学module,就用类似的步伐来学吧 07/04 13:57
30F:→ GALINE: 只是因为语言不是原生支援PSR4所以痛苦指数会增加... 07/04 13:57
我用作者特权整理一下推文顺序
31F:推 rickysu: class还是得搭配design pattern否则写出来的东西很容易 07/04 13:58
32F:→ rickysu: 沦为包了class的function。 07/04 13:58
33F:→ rickysu: 以前曾经看过一堆static function的class 07/04 13:59
34F:→ rickysu: 还不如直接写 global function 算了还可以少打几个class 07/04 14:00
35F:推 tkdmaf: ricky讲的没错,只是若要论循序渐进,class应该列在基本 07/04 14:00
※ 编辑: GALINE (60.248.122.205), 07/04/2017 14:02:44
36F:→ GALINE: 另外我觉得以个人开发「老写法」其实没有想像中的差 07/04 14:03
37F:→ GALINE: 但是需要自己非常遵守很多容易被打破的纪律 07/04 14:04
38F:→ GALINE: 不过多人开发除非是很有默契的强者不然会很容易乱... 07/04 14:05
39F:推 tkdmaf: 所以啊,有现成的经验和规范也有书了,不学那些要自干经验 07/04 14:05
40F:→ GALINE: 这方面来说使用PSR不只是工程问题,也是政治问题 07/04 14:05
41F:→ tkdmaf: 的话就自然相对累人。撞墙法则也不是每个人都像我驾轻就熟 07/04 14:06
42F:→ GALINE: 同事或主管订的规范会被靠北,那「官方」规范总行了吧 07/04 14:06
43F:推 tkdmaf: 所以啊,既然官方有规范的那class和namespace要不要学? 07/04 14:08
44F:→ tkdmaf: 要嘛……大家都学好,大家都守规范,大家都轻松。 07/04 14:09
45F:→ tkdmaf: 不然来个新人,跟你这个没学过那个不会规范不懂你不累死? 07/04 14:09
46F:推 rickysu: 如果大家都是遵照PSR4的autoload,後续维护整合就很简单 07/04 14:16
47F:→ rickysu: 可是如果有人硬是要自己 include 然後 include path 07/04 14:16
48F:→ rickysu: 又不知写在哪,其他配合的人就会相当痛苦。 07/04 14:17
49F:→ rickysu: 尤其是许多"老写法"通常隐含着side effect,include 後 07/04 14:18
50F:→ rickysu: 东西就很神奇的跑出来, include 第二次,就很神奇的烂了 07/04 14:18
51F:→ rickysu: 充斥着一堆untestable code。套句现代术语 07/04 14:22
52F:→ rickysu: 只要是无法测试的 code 他就应该要被重构。 07/04 14:23
53F:推 gname: 老写法对於新而言是好的,让他们可以感受什麽叫作因需求而演 07/04 15:06
54F:→ gname: 进,然而就会冒出一群叫你直接学framework,又快又方便 07/04 15:07
55F:→ GALINE: Yeah,所以说个人开发,cli tool 七八百行我觉得极限了 07/04 17:19
56F:推 agda: 推最後一句 07/04 19:52
57F:推 xdraculax: PHP 阵列跟字串的函式参数都不统一,总是要看提示 07/05 10:09
58F:推 nfsong: 推 07/15 23:13
59F:推 JohnRoyer: like 08/29 10:09
60F:→ see7di: 没有意义的争论,有这个时间不如多学几种语言,做项目时 08/29 19:20
61F:→ see7di: 多增加几种可选项 08/29 19:20
62F:推 crow1270: 身为新手在几个月後来看这篇终於看懂了,大推新手根本无 10/26 18:39
63F:→ crow1270: 法直接从MVC、framework开始。 10/26 18:39
64F:推 kevinheyo: 很爱 PHP,但曾被它的 csv parser 搞到很抓狂 XDDD 12/19 13:20