我们计划从头开始一个新项目,为此评估了一些PHP框架。我们的备选列表有CakePHP , CodeIgniter , Symfony和Zend 。 我们分别使用这4种框架编写了一个相同的小应用(一个简单的Wiki应用),希望我们能尽快选定一个最合适的。
声明:我会努力确保自己的客观性,虽然我是一个ColdeIginter的爱好者。我所工作的公司是Zend的合伙人(我们已经使用了Zend Platform 和 Zend Studio)。
尽管一开始的计划是评估4个框架,但是这篇文章实际是CodeIgniter和Zend Framework的直接比较。在花费了几个小时研究了这4个框架后,我不得不把Symfony和CakePHP从名单中排除。理由如下:
Learning curve 学习曲线
Symfony 和 CakePHP都有一个非常陡峭的学习曲线。CakePHP有严格的规则:数据表明此、文件位置、方法名和类名。Symfony使用 .yml 格式(需要学习,虽然它不是真的很难)来存储配置信息,并且大量的操作需要通过控制台(console)完成,创建数据表、数据模型和很多其它文件都需要使用命令行。
Strict ORM: 严格的ORM
Symfony 和 CakePHP都有一个成熟的对象关系映射器(object-relational mappers ORM) ,提供对数据的访问,但是这一特性很难被禁用,除非作出大量的努力。这些ORM有着严格的规则和约定,它们必须被遵循。与之相反,Zend Framework 和 CodeIgniter 在是否使用Models和如何使用Models上非常灵活的。使用Models是可选的,虽然它们都有数据映射器(data mappers),但没有这些应用一样可以进行(开发编写)。应用的数据操作将是极其密集和精细(intensive )的,我们不愿意受到选择的限制。
Flexibility: 灵活性
Zend Framework和CodeIgniter比其他两个框架更灵活。
最终对比
CodeIgniter | Zend Framework | |
Set Up 初始建立 |
CodeIgniter很容易初始化。 复制框架的所有文件到网络服务器,这是一个不错的开始。 它的文件夹也很小-大约2 .1兆。从开始建立,5分钟后,我就可以显示出默认主页。 | Zend Framework需要麻烦一些,它需要创建一个bootstrap文件,填写所有的初始化设置。比较之下,框架有点大-大约12.4MB。整个初始建立过程用来大约19分钟。 |
文档 |
文档的结构和组织相当好,但是不如Zend Framework详细。CodeIgniter有论坛和Wike,有很多用户提交的代码。 | Zend Framework有非常详细的文档,并且有很多示例。在我看来它的文档结构不如CodeIgniter,这可能是受到前面提到的细节和大量的可用的部件影响。ZF 也有一个Wiki,里面有少量的教程。 |
模板 |
CodeIgniter包括一个模板分析器类,在我看来,它的作用是有限的,因为它不支持逻辑(例如,IF语句)。不管怎么说,CI建议在模板(view)中使用PHP标签。 | ZF 包含了一个布局类,用于给整个站点或者应用提供一个通用布局(或者多个布局)。它直接在模板中使用PHP标签,它也提供了一个抽象的View类,可以使用第三方模板库进行扩展。 |
组件 |
CI有很多库和帮助器来简化开发过程。尽管这些相比ZF还是显得少,但大体上,用法更简单(While it does have less of these than ZF, in the main, the usage of the CI variants is simpler)。 | ZF有巨量的类和组件。它们有着很好的文档但使用起来要比CI的稍微复杂一些。 |
数据访问 |
CI には、データベース接続を処理するためのデータベース クラスがあります。このクラスは、標準 SQL クエリを使用して、標準 PHP メソッドを使用して作成、取得、更新、削除を行うことができます。 CI は、Active Record Database パターンの修正バージョンである Active Record クラスも提供します。このパターンを使用すると、データの取得、挿入、更新に使用するコードを減らすことができます。場合によっては、データ操作の実行に必要なコードは 1 行または 2 行だけです。シンプルさに加えて、Active Logging の主な利点は、クエリが別のデータベース アダプタによって生成されるため、データベースに依存しないアプリケーションの作成が可能になることです。クエリのセキュリティも考慮されており、システムは自動的に変数をエスケープします。 | Zend_Db とその関連クラスは、ZF 用のシンプルな SQL データベース インターフェイスを提供します。標準の SQL クエリを受け入れますが、クエリ結果を取得するプロセスが簡素化されます。これには、テーブル データ ゲートウェイと行データ ゲートウェイを使用した ORM も含まれています。データテーブルとデータ行をそれぞれオブジェクトにパッケージ化し、開発速度を大幅に向上させます。欠点は、CI で使用される変更されたアクティブ レコード パターン (広く使用されていない) と比較して、パフォーマンスがわずかに低下することです。 Zend_Db はテーブルのリレーションシップも処理できます。 (Zend_Db は PHP クラスでテーブルの関係をモデル化することもできるため、データベースの結合が簡単になります。) |
柔軟性 |
CI は非常に柔軟で、ほとんどすべてのデフォルト設定を変更できます。 | ZF は、実際には単純なクラスのコレクションです。ブートストラップ ファイルに追加されている限り、すべてのファイルとディレクトリを任意の場所に配置できます。 |
検証 |
CI でのデータ検証は検証クラスによって処理されます。一部のルールは定義され、検証オブジェクトに割り当てられ、URL またはフォームから送信されたデータを自動的に検証します。プログラマは、これらの取得をどのように処理するかを決定できます。検証クラスは、指定されたフィールドのエラー メッセージを自動的に設定するのにも役立ちます。 | Zend_Validate は、一般的に使用されるバリデーターのセットを提供します。また、シンプルなバリデーター接続メカニズムも提供し、複数のバリデーターを指定された順序で単一のデータ (データ) に適用できます。 ZF では、各バリデーターは異なるクラスであり、CI のようにデータがクラスに渡されるのではなく、そのクラスがデータに追加されます (フィルターのように)。 ZF では、各バリデーターは別個のクラスであり、CodeIgniter のようにデータがクラスに渡されるのではなく、そのクラスが (フィルターのように) データに追加されます。 |
フォーム |
CI のフォーム ヘルパー ファイルには、フォームの操作を支援するいくつかの関数が含まれています。その機能はフォームフィールドを生成することですが、それでも HTML を記述することは避けられません。 | Zend_Form はフォームの作成と処理を簡素化します。要素のフィルタリング、検証、データのエスケープ、フォームのレンダリングを処理します。 Zend_Form を使用すると、ZF は PHP を使用して、ラベル、検証、エラー メッセージを含むフォームを完全にラップできます。 |
パフォーマンス |
CI は ZF の約 2 倍のパフォーマンスを持っています | ZF は CI よりも約半分遅い |
テスト |
CI には単体テスト クラスがありますが、テスト コードと実際のコードの混合を奨励するため、お勧めしません。単純なテストにはサードパーティの拡張機能を使用する場合があります。ただし、SimpleTest 用のサードパーティ拡張機能も利用できます。 PHPUnit を CI クラスで使用することもできます。 | ZF には組み込みのテスト クラスがありませんが、そのコア クラスはテスト フレームワークとして PHPUnit を使用し、追加のクラスを含めるように拡張できます。 ZF で SimpleTest を使用することもできます。 |
国際化 |
いいえ | はい |
承認 |
BSD スタイル | 新しい BSD |