如何快速提高我的PHP“高级”知识水平?

74

我已经使用PHP工作多年,对这种语言有很好的掌握,并创建了许多高级和不那么高级的系统,它们都运行得非常良好。

但我现在遇到的问题是,只有在需要用到之前未学过的内容时,我才会去查找解决方案和其他处理问题的代码,这样我就会学习到一些我以前没见过的新函数或结构。正是通过这种方式,我学习了许多更好的技术(例如研究由亚马逊、谷歌或其他大公司发布的类)。

这种方法的主要问题在于,如果你不知道某个东西的存在,就无法学习它。例如,我编程了几个月才学会使用 empty() 函数,以前只是用 strlen() 来检查空值的长度。

现在我正在构建越来越大的系统,开始阅读像highscalability.com这样的博客,并研究MySQL复制和服务器数据以进行扩展。我知道代码结构非常重要,才能使整个系统运作良好。

阅读最近一篇关于Reddit架构的博客后,我开始质疑是否存在某些标准或“公认的系统”。

我曾经研究过框架(我用过Kohana,但后悔了,决定PHP框架不适合我),我更喜欢拥有自己的函数库而不是使用框架。

我的当前结构是WordPress、Kohana和我的个人知识的混合体。

我认为以下几种方法可能会有所帮助:

  • 阅读博客
  • 阅读教程
  • 与别人合作
  • 阅读书籍

那么,什么方法能够使我进入下一个阶段——成为一名非常出色的系统开发者?

15个回答

115

每个想要成为PHP程序员的人,总是只关注第一个词而完全忽略了第二个。

虽然"编程"比"PHP"更重要,但要成为一名PHP专业人士,首先应该是一名程序员。

因此,我会选择最后一种方式——阅读书籍。不是关于PHP的,而是关于编程的一般性书籍。例如Grady BoochMartin Fowler 甚至是老牌的Donald Knuth的著作。
还可以看看其他一些语言,比如Java或Python。不是要转换使用它们,而是要向它们学习。


26
没错,但你所说的“其他语言”是什么意思?为什么一个网页程序员需要了解只针对桌面应用程序的东西呢?我总是想不通为什么成为“特定语言方面更好”的答案总是“学习另一种语言”,并且还有很多人点赞。学会讲意大利语的答案是学习拉丁语吗?有些人可能会这么说,但在我看来,学习另一种你不会使用的语言只是为了间接地让学习另一种语言变得“更容易”而并不值得。 - Lotus Notes
10
抱歉出现了两次回复,但我无法编辑。原帖中明确要求具有高级PHP知识。也许我太天真了,但你真正可以在编程语言之间自由转移的只有设计模式(如果你愿意,可以在纯PHP中学习),算法(在Web编程中非常情境化)和一般的最佳实践。我发现大部分"学习"一门语言所花费的时间都用于弄清楚特定的库,无论它是否标准。唯一真正的问题是,开始使用PHP而不是像C ++或Java这样的语言的程序员很难使用面向对象编程(OOP)。 - Lotus Notes
4
@Byron:你第二条评论的最后一句话与你之前所说的完全相反。 - stagas
2
我还想补充一点,如果你看看其他一些语言,比如Ruby,你可能很快就会考虑从PHP切换 :) 我和你一样也处于同样的位置,现在正在认真考虑放弃PHP。 - Tom
22
学习英语让我更加关注我的母语德语,学习日语显著提高了我的英语水平和对语法的整体认识。学习JavaScript拓宽了我的函数和对象思维,涉猎Haskell和Ruby向我展示了许多有趣的概念,这些概念反映在我的PHP技能上。因此,我肯定会认为,学习其他东西可以提高你的“主要”语言水平。学习拉丁语肯定会增加你对大多数欧洲语言的理解。 - deceze
显示剩余9条评论

28

我更喜欢自己的函数库而不是使用框架

你将“函数库”和“框架”作为不同的概念(很好!),那么为什么不试着将函数库变成一个框架呢?当然,这是一种很好的学习方式,但不是获得市场技能的最佳方式;)

这也是一种学习错误的好方法,因此在开始之前,您必须进行一些研究。

“必备”功能

几乎所有框架都具有某些功能,这是有原因的。研究它们;找出它们存在的原因以及它们的变化;选择您想要包含在框架中的实现。

非PHP平台的特点,你想了解并模仿

  • 如果你喜欢Ruby,也许你想要一种方法来在类中包含模块
  • 如果你喜欢Asp.NET,也许你想尝试在PHP环境中创建服务器控件
  • 对于HTML默认情况下为可原谅的感到不满?为什么不在服务器端验证输出呢?

我不知道你感兴趣的是什么,所以就到这里吧。

发布它!

这部分很重要,因为Nathan是正确的:你的工作必须被其他人看到、挑战、批评和纠正。不要把那盏灯藏在灌木丛下——它需要被看到;将其放在Google code或sourceforge等地方,如果人们认真地关注它,你需要认真对待它;你需要维护单元测试和回归测试;你需要使用版本控制;你需要好好注释,每个文件的顶部都有一个大的/*头部注释*/,对于每个类和成员,还需要有有用的文档生成注释。

总结

如果你做到了这些,你可以(在高水平上)学习其他平台。作为 PHP 开发者,你一定能够 "ding 40"。你可以学习单元测试;回归测试。你可以学习有效的文档编写。保证你的框架会变得 "特殊而且可能很糟糕",但是你可以从中学到很多东西。只需记住,框架不是产品,而是一种旅程......

只是为了争论的缘故 ;) - Richard JP Le Guen
哈,谢谢Richard。不幸的是,我们现在人手不足,同时正在处理3-4个主要系统,所以我没有时间建立一个实际的框架。虽然我可以清楚地看到这样做的优势和原因,但我也赞同不重复发明轮子的想法。与其自己创造一个框架,我更愿意先研究另一个框架并找出它们的优点和缺点。 - Kerry Jones
@Nathan - 没问题...谢谢你关注props而不是我的-1 :S - Richard JP Le Guen
@RJPLG - 呃,这里的人气有点差劲!Perl问题的评论者更有品位 :P - Nathan
我非常赞同这个观点。你只有通过尝试和失败才能变得更好。没有其他捷径。 - FredTheWebGuy

18
  1. 了解PHP的隐藏功能PHP的预定义接口
  2. 学习不同的编程语言。学习比PHP更陡峭的学习曲线的语言。每当我指出其他语言优于PHP的优点时,我都会被指责PHP bashing,大多是那些显然从未真正掌握过其他高级语言的人。但我要冒险尝试。我建议Ruby、Python、Pearl和haXe(作为严格类型的对应物)。一旦你学会了它们,尝试将你的新知识应用到PHP上。或者只是远离PHP,以防你不想回去(我认为这种情况并不太可能发生)。
  3. 学会处理批评。你对Nathan的帖子的反应很明显表明你还无法处理它。他是完全正确的。
    • 现在看我的第一个PHP框架,我必须说它相当糟糕。当时我认为它很棒(它仍然比我已经部署的许多生产代码要好)。尽管如此,它有许多缺陷。除非你是一个天才,否则你的第一个框架在几年后回头看起来会很糟糕(假设你在发展)。
    • 实际上,任何你创建的框架随着时间的推移都会变得更糟(假设你不停止进化)。因此,你可能会使用可用的框架,并更多地关注应用程序开发。如果你使用的框架有限制,请考虑贡献而不是编写另一个PHP框架。
    • 选择编写自己的框架(不仅仅是为了娱乐/学习,而是为了生产部署)的时机是当你的要求超过其他现有框架所提供的而不是当你不喜欢使用一个框架的想法。这是一个常见的错误,我自己也犯过。但现在我可以说,我从中学到了东西。但如果你寻求建议(我当时不幸没有这样做),你会得到像这样的答案。
    • 从别人编写的代码中工作可以让你学到很多东西。不仅可以掌握由其他人深思熟虑的框架提倡的概念,还可以学习如何高效、灵活、团队合作和完成工作(同时获得相当好的结果)。
    • 我想你肯定不认为自己比PHP开源项目中的每个团队都要好,否则你就会问。克服年轻开发人员的顽固本能,不要重复造轮子,成长起来解决别人尚未解决的问题。
  4. 了解组件库和框架之间的区别。由于你认为可以用“自己的函数库”替换框架,所以你可能还没有理解框架的关键。看看依赖反转控制反转依赖注入
  5. 学习软件设计。查看像SOLIDGRASP这样的面向对象原则。
  6. 尝试不同的范式。AOP,函数式编程。使用具有更强大面向对象特性的语言(如Ruby、Objective-C或Smalltalk)增

11

以下是一些想法:

  • 尝试不同的事情。学习新语言。有时候在学习其他语言的过程中,实际上可以让你在两个方面都更加优秀。

  • 为开源项目做出贡献。

  • 高可扩展性和PHP / MySQL不兼容。今天有一些专门针对此类问题的技术,例如node.js和Redis。

  • 在StackOverflow上回答问题。别人的问题可以让你跳出思维定势,通过帮助他人来改进自己的过程,并且你也为他人做了一件好事。

  • (如果我想到其他任何东西,我会在这里添加,我刚刚醒来喝咖啡:D)


10
我不同意高可伸缩性和 PHP/MySQL 不兼容的说法,例如 Adobe 使用 MySQL,Facebook 使用 PHP。除非你是指它们一起使用?但我仍然怀疑。其他方面都很好。 - Kerry Jones
11
很难从一个叫做@back2dos的用户名的人那里直接接受这个建议。 :p - Kzqai
2
@back2dos -- 但海军的主要领域不是计算机,Facebook才是。他们拥有超过60,000个服务器,并多次重写了他们的代码,他们有选择从PHP/MySQL转换,但他们没有这样做。是的,他们使用HipHop,但他们用PHP编写。这并不意味着HipHop不能从一开始就实现。 - Kerry Jones
3
我没读那篇文章,因为我已经读过很多其他的文章了。我有说过Facebook拥有比海军更多的电脑吗?不是,这样把话套在我嘴巴里很不好。另外,如果你要发出荒谬的指控和声明(比如PHP和飞行员……没有飞行员能在0.0001秒内做出反应,而PHP可以轻松计算),我看到很少引用参考资料和很多人恶意攻击。Yahoo!、YouTube和Wikipedia都使用PHP,它们是网络上流量最大的网站之一。 - Kerry Jones
1
冷静点,没有哪种编程语言是圣杯,它们只是工具而已 ;) 关于那篇文章:请好好阅读Joel Spolsky关于“除非绝对必要,否则不要从头开始编写”的建议。希望你也能理解海军所谓使用Windows 2000(或任何其他你想抨击的软件)背后的一些原因。 - Halil Özgür
显示剩余8条评论

3

学会以不同的方式做你已经知道的事情。例如:

  • 用另一种语言
  • 在不同的平台上
  • 并行/分布式地进行
  • 通过框架(是的,你可能认为它们“不适合你”——也许尝试一个不同的,它们有时非常不同)

3
我会加入讨论板块并尝试解决其他人的问题。有时候会有很有挑战性的问题,这会迫使你做一些研究。如果你无法回答问题,可以等待那些能够回答的人并从中学习。
至于框架,要向它们学习。我也会自己编写代码,因为大多数现有的框架可能会比较慢。虽然对于大多数网站来说速度已经足够快了。
我还建议看看Facebook的PHP库。他们在里面做了一些有趣的东西。

谢谢你最后一句话。 - Kerry Jones

3
也许你应该重新考虑使用框架,我建议你看看Zend框架,因为它更像是一个组件库,你可以根据需要使用,并不会强制要求你遵循严格的结构(像其他一些框架那样),尽管它建议一个(非常理智,我认为)项目布局。一个很好的起点是Surviving the deep end
你还没有提到的一些东西,在更大的项目中可能会有用:

Zend会降低速度吗?许多框架都会大幅降低速度(我查看了基准测试,即使是那些声称速度很快的框架与没有框架的相比,速度也要慢得多)。 - Kerry Jones
如果您使用自动加载,那么是的,它会降低速度。如果使用许多不同的组件,那么也是如此。但是,您获得的灵活性(以及标准化,不仅适用于您,还适用于未来的员工/同事)超过了使用框架的缺点。当然,这是您必须自己决定的事情。如果需要,您可以轻松缓存输出的块。但 Zend 的好处在于,您可以在应用程序中仅使用您想要/需要的组件,而不是整个套餐,并将其与其他代码混合使用,以适合您的需求。 - wimvds
2
顺便说一句,使用操作码缓存(如XCache、Zend Optimizer等)可以极大地提高脚本的速度,如果您担心速度的话(尽管当然会使用更多的资源 - 内存/磁盘)... - wimvds

3

简单明了:去做吧。需求会促使你学习。找到参与更高级别的项目的途径,无论是商业还是开源项目。这是你真正学到东西的唯一途径。


2

您最好的选择是购买一本关于高效算法的书籍。在每个计算机科学学生的生活中,都会有一个时间需要学习这些内容。在那里讨论/解决的问题是几乎任何你可能面临的现实世界问题的抽象。

除此之外,阅读其他人如何做到的博客也是完全可以的,因为它可以帮助您理解如何实际使用(甚至实现)高效算法的原则。

祝好。


你能推荐一本好书吗? - Shyam

2
与其他开发人员合作是非常重要的。我认识三个开发人员,其中两个是我日常工作中的同事,他们的知识让我惊叹。我会询问他们对我所做的每件事情的意见,不是因为我怀疑自己的想法,而是因为我想听听来自那些我尊重的开发人员的想法,尤其是其他人的想法可以帮助我学到更多东西。如果你没有接触过其他高级开发人员,那么一定要在SO或其他开发者论坛上发布问题,并寻求其他人的意见,询问人们如何解决特定项目/问题。通常情况下,除非你看到它们被使用,否则你不会学习新的技术/方法/函数(如果你不知道它的存在,你怎么知道该找什么?)
此外,正如已经提到的,参与一个开源应用程序也很重要。去sourceforge找一个需要开发者的项目。或者下载一个应用程序并尝试为其编写插件(我正在为Invision 3.0编写插件并学到了一些东西)。
希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接