学习PHP - 是使用框架还是不用?

13
我注意到我的地区有很多PHP的工作机会。虽然我以前没有用过PHP,但我认为如果我学习它,就可以获得更多的机会,这可能是一个好主意。问题在于没有任何框架的PHP代码丑陋,99%的时间是非常糟糕的代码。所有我看到的教程和书籍都非常糟糕——它们从来没有展示过任何良好的编程实践方法,而总是采取快速而肮脏的方法处理事情。我担心通过这种方式学习PHP只会在我脑海中留下这些不良实践,并使我浪费时间试图去改正它们。我以前使用过C#,所以我熟悉面向对象编程和软件设计模式等方面。

我应该尝试使用其中一个较为知名的PHP框架来学习PHP吗?迄今为止,我已经看了CakePHP、Symfony和Zend Framework;Zend似乎最灵活,而不像Cake和Symfony那样限制太多(尽管Symfony似乎比CakePHP少一些限制,后者试图过分模仿Ruby on Rails),但我看到的许多Zend的教程都假设你已经了解PHP,想要学习如何使用框架。

对于我来说,学习PHP的最佳机会是什么,但要学习使用真正的软件工程技术而不是乱七八糟的代码?似乎所有PHP的书籍和资源都假定你只是使用原始的PHP,因此展示了不良实践,或者你已经熟悉PHP,因此甚至不涉及语言的某些部分。


1
这应该是一个社区维基。 - John Conde
谢谢,现在我将其设置为 CW。我从来不确定什么应该或不应该是。 - Kevin Torrent
(相关)https://dev59.com/nkvSa4cB1Zd3GeqPdVLy - Gordon
“问题在于没有任何框架的PHP代码很丑陋,99%的情况下是非常糟糕的代码。”这是一种泛化的说法,即使你承认自己不了解PHP。 - tereško
8个回答

12

入门指南

如果您想学习PHP(没有PHP经验),我建议您先选择一个易于学习的框架,如Codeigniter。观看他们的视频教程后,您会发现使用Codeigniter可以在20分钟内创建一个简单的博客。我认为您不能仅凭PHP的基础知识编写此类代码,因为Codeigniter已经具备了以下坚实的基础:

  • MVC:在我看来,这有助于您编写干净分离的代码。

    MVC是一种软件方法,将应用程序逻辑与演示文稿分开。实际上,它允许您的网页包含最少的脚本,因为演示文稿与PHP脚本分离。

  • 数据库:该模块可以帮助您解决大量的数据库问题。

    CodeIgniter提供了一个全功能、非常快速的抽象数据库类,支持传统结构和Active Record模式。数据库函数提供了清晰、简单的语法。

  • 易于使用:Codeigniter非常容易上手,这是一个巨大的优势。

    安装CodeIgniter只需四步:

    1. 解压缩包。
    2. 上传CodeIgniter文件夹和文件到您的服务器。通常,index.php文件将在根目录下。
    3. 使用文本编辑器打开application/config/config.php文件,并设置基本URL。如果您想使用加密或会话,请设置加密密钥。
    4. 如果您想使用数据库,请使用文本编辑器打开application/config/database.php文件,并设置您的数据库设置。
  • 快速: Rasmus(PHP 创始人)对比了很多 PHP 框架(幻灯片 24-32),可以看到 Codeigniter 的表现优秀。另外我想提醒的是,http://talks.php.net/ 上的幻灯片大多数都非常好。

学习 PHP

过去我偶然发现Matt Zandstra 的 PHP 书籍,非常不错,我认为你应该阅读它以适当地学习 PHP。

PHP “最佳”实践:

“干净”的代码:

  • 学习 Recess PHP 框架。我也非常喜欢这个框架。它将帮助您创建类似 rest 的应用程序。
  • 学习 TDD/PHPunit 来正确测试您的代码。
  • 学习 MVC。
  • 学习 OOP。

性能:

  • APC: 如果可能的话,您应该安装 APC 来加速 PHP。它将在内存中存储 PHP opcode(巨大的提升)。
  • Memcached: 当数据库负载很重时,您还需要将查询存储在内存中。

祝你好运!


2
令人惊叹的答案,出色的参考资料,喜欢Rasmus基准测试+1。看到CackePHP如此缓慢真是太神奇了。另一个基准测试链接是http://www.ruilog.com/blog/view/b6f0e42cf705.html,而CackePHP仍然表现糟糕。 - Marco Demaio

6

如果你担心学习PHP时没有使用框架会在你的头脑中留下不好的实践,那我们有更大的问题。;) 我认为,在学习任何语言之前,你应该熟悉这门语言本身,然后再熟悉任何类型的框架。作为一个深入探索过许多PHP框架的人,我可以保证使用框架不会自动帮助你学习“好的PHP”(在控制器等方面仍然很有可能编写烂代码)。

我的建议是什么?如果您已经熟悉面向对象编程,那么学习PHP中的良好的面向对象编程实践就不会有困难。首先要做到这一点-确保你熟悉这门语言及其怪癖。一旦达到这个水平,你将有更好的基础来欣赏你选择的任何框架。

(我建议你不要对Zend框架抱有太高期望;是的,它在某种程度上是“灵活”的,因为它是围绕MVC概念打包的一系列松散的库,但它在许多方面过于复杂且缺乏真正的MVC功能)


嗯,我会记住这个的。主要问题是我读过的所有书籍/教程都没有涉及面向对象编程,所以我担心看它们来学习PHP会让我忘记“好”的方式(你知道,我已经有一段时间没做C#了...)。关于ZF也会记住的。Symfony看起来也很不错,但是ZF似乎更灵活,可以做出更多选择;对于遗留系统使用更好(考虑未来如果我得到一个PHP工作)。 - Kevin Torrent
请查看http://stackoverflow.com/questions/90924/what-is-the-best-php-programming-book,以查看此社区的好PHP书籍列表。是的,ZF不那么受限制-这使得学习它比如Cake更困难,但你是对的:如果你变得熟悉最低公共分母,你可能更适合多方面的PHP工作。 - ABach

2

首先从基础开始学起,否则你会在不了解基本知识的情况下寻找修复方法。毕竟,PHP是免费的,而且Apache和MySQL也是如此。设置它们可能需要一天时间,即使你犯了很大的错误,也应该可以轻松完成。之后,你可以自由地进行尝试。

PHP最好的特点是编译更改只需刷新页面8)


这是许多新技术的问题(看着你,Rails)。你学会了如何将事物适应框架,但一旦遇到问题,你就会不知所措,因为你只知道如何使用框架,而不知道框架实际上是做什么的。有趣的是,我见过的唯一一个不是这样运作的框架是Django,因为该框架非常松散,你仍然必须编写几乎所有内容。 - Wayne Molina

1
问题在于没有任何框架的PHP代码很丑陋,99%的时间是非常糟糕的代码。

这不是正确的说法。确实有很多丑陋和糟糕的代码存在,但没有框架的PHP并不本质上丑陋,也不会自动成为糟糕的代码。冗长的,是的,其他的则不是。PHP只是容易入门。这就是它受欢迎的原因,而且许多人使用PHP快速发布网页时并没有接受过教育或关注软件工程。

如果你掌握了面向对象编程(OOP)和面向对象设计(OOD),那么你将毫无问题地将这些知识应用到你的PHP代码中。只需阅读PHP手册以获得入门指南。你会发现某些东西在C#中无法正常工作,但这对你来说不应该是什么新闻。

关于是否应该从框架开始学习,我会说不要。了解框架的作用,它旨在简化Web应用程序的开发。不要使用它来学习PHP。也不要期望PHP框架是干净和可维护代码的奇迹。有好的框架存在,但也有很多垃圾

同意这个观点。PHP主要不好是因为学习曲线太低。这并不意味着所有的PHP都是垃圾...虽然我必须说,我觉得它看起来非常丑陋 :) - Wayne Molina

1

所有语言中的糟糕代码看起来都很烂。PHP只是让你更容易编写这样的代码,并在你这样做时提供视觉线索。

一般建议是:在使用框架之前先学习php。

它们都有缺陷,所以你可能会从中学到不良实践。此外,你会把所有的鸡蛋放在一个篮子里——这是一个糟糕的长期策略,特别是如果你将要在php开发方面工作。

当你学会了php后,尝试制作自己的php框架。这几乎是一种成年礼。如果你没有写过至少3个php框架,你就不能正大光明地称自己为“php开发者”。这将给你至少一些关于php框架的理解。

哦...远离其他人无疑会推荐的CakePHP和CodeIgniter框架。它们很糟糕,充满了不良实践。如果你必须选择一个框架,那么看看Symfony2或Kohana(带着巨大的保留)。它们都有缺陷,但至少它们听说过一些“最佳实践”。底线是:所有php框架都很糟糕。有些比其他的更糟糕

并学习经典MVC、Model2 MVC和MVP之间的区别。大多数php框架故意忽略这个区别。

所以......總結一下,以下是你應該學習的東西:
  • 編寫正確的Model2 MVC
  • 迪米特法則
  • SOLID原則
  • 全局狀態是什麼以及為什麼它不好
  • 依賴注入

0

尝试看看codeigniter。它很容易入门。

与Ruby和RoR不同,PHP框架没有实际标准。

我的建议是:尝试使用一个框架,在你无法理解某些内容时阅读书籍和文章。


你知道的,我之前看过那个,但是我对它并不是很感冒。它似乎太像一个草率的尝试,把混乱的 PHP 代码带入 MVC 的世界。我想我更愿意使用一个完整的框架,比如 Symfony 或者类似 .NET 库的 ZF。但我会再看一眼。 - Kevin Torrent
CodeIgniter 很好,但并不完全没有坏习惯,因为他们非常努力地保持向后兼容性。 - Kemo
我会推荐Symfony,特别是新的Symfony。它非常好用,代码编写得很好,是一个真正解耦的MVC框架。http://symfony-reloaded.org/它绝对是最受欢迎的框架。我收到的大多数工作邀请都是关于Symfony的。 - Flukey
是的,向后兼容性是CodeIgniter的一个问题。但它简单而快速,并且不需要大量的内存。它是一个很好的框架,可以让你按照自己的喜好使一切工作。例如,你可以扩展Model类来创建自己的Model类,其中包含诸如表自动重建、嵌套集等任何你想要的功能。 - Maksim Burnin

0

这是我的观点:

如果你想要学习 PHP,不要从框架开始,从头开始编写所有内容,这将大大提高你的技能,因为如果你使用了框架,你就不必做太多事情,也就无法学到更多,因为框架通常为不同的事情提供了许多现成的解决方案。

一旦你对 PHP(特别是面向对象编程)有了很好的理解,那么你应该转向框架,这时候框架对你来说也会更容易。一旦你掌握了 PHP,你可以添加或修改框架(使用自己的类等)。最后,我建议你选择 CodeIgniter 框架或 Kohana(改进版)。


即使我已经通过使用其他语言了解了面向对象编程,这是否仍然适用?我想应该是的,因为PHP的面向对象实现仍然有点奇怪! - Kevin Torrent
@Kevin Torrent:除了支持某些特定事物和命名约定之外,面向对象编程在所有语言中基本上都是相同的。是的,这应该对你有所帮助,但是关于语言的其他核心基础知识呢?你需要掌握它们才行...... - Sarfraz

0

我的观点是先看一些教程,学习PHP如何处理事情与C#不同的基础知识(例如数组的工作原理,哈希的工作原理)。然后,一旦你理解了这一点,就可以去使用框架。不要浪费时间在大多数其他PHP教程上,因为它们只会展示非常糟糕的编码实践(看看一半的PHP/MySQL教程-从来没有任何分离,都是过程式风格--你要避免那些东西)。

由于我自己不使用PHP,所以我不能偏袒一个框架而不是另一个。从我所了解的来看,Symfony似乎是最好的选择,因为它提供了一系列工具,可以在不受传统约束(如Rails)的情况下完成所需的任务。你也提到了Zend Framework,它似乎是一个不错的选择,但更像是PHP的J2EE;它不是一个真正的框架,而是一组有用的库。长期来看,它可能是最好的选择,因为它不强制使用整个框架,而是可以将其作为工具包添加到所有项目中使用。例如,如果你正在处理旧的过程式DB访问方式的遗留PHP项目,你可以引入ZF的数据库层进行重构,而不必引入其他部分。但是,对于Symfony等框架,你无法这样做。

CodeIgniter/Kohana(据我所知,Kohana是它的进化版)也有一大批支持者,但我无法评价它的好坏。我知道CI将MVC强行融入其中,以兼容旧的“糟糕”PHP编程方式。它有很多支持者,所以也值得一试。

我刚想到的ZF的另一个好处是,如果你找到了PHP工作,那么请记住,他们很可能不会使用框架,特别是如果所涉及的应用程序已经存在几年以上。很有可能它将是标准的Classic ASP(我相信你熟悉或至少听说过那些恐怖故事)的方式,即在PHP页面中拥有数十个包含文件并混合逻辑和表示。在这种情况下,与其将所有旧代码扔进垃圾箱并从头开始使用全栈框架,不如使用ZF更容易集成。这只是一些思路。

再次强调,我不是PHP专家,但我会遵循以下一般路径:

  1. 阅读中级PHP书籍以了解语言的细微差别(由于你已经有编程经验,因此避免初学者的东西)
  2. 查看Symfony,以便您掌握“全栈”框架
  3. 查看Zend Framework,以便您拥有一组工具库,可用于比框架本身更复杂的项目(即任何超出基本CRUD屏幕的内容)和/或现有项目的集成。

希望这可以帮助到你!


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