【问题标题】:Building a real object oriented framework in PHP, suggestions wanted用 PHP 构建一个真正的面向对象框架,需要建议
【发布时间】:2009-10-02 21:39:34
【问题描述】:

我一直在使用 CodeIgniter 框架,但是在学习了 Java 和接口、抽象类、包等很棒的特性之后,PHP 5 也支持这些特性中的大部分,我准备毕业并构建一个 真正的 PHP 中的 OO 框架,它使用了所有这些功能(包括命名空间),因此我可以构建更优雅的设计。

我在想的是,与其在 CodeIgniter 中所做的那样,系统中的所有内容都共享一个 $this-> 对象,例如:

$this->load->model('box');
$this->box->something();

您将执行以下操作来加载 Box 模型并调用其 something() 方法。

$box = new Framework\Models\Box();
$box->something();

或以下

abstract class BaseController
{
   public function getModel($name)
   {
      $model = new Framework\Models\$model(); //Is this valid code?
      return $model;
   }
}

class MyController extends BaseController
{
    public function index()
    {
        $box = $this->getModel('box');
        $box->something();
   }
}

对于构建它有什么建议/指针,例如框架需要哪些最小系统类、我应该拥有哪些命名空间或任何其他功能?

【问题讨论】:

  • 不要使用 OOP,因为你想使用 OOP,在有意义的地方使用它,而不是其他地方。对于 PHP 尤其如此。
  • 您正在从事一项艰巨的工作,并得到许多其他人的支持。我建议您将这种强烈的精力投入到开发出色的应用程序中,或者做一个明显不同的(与普通的 MVC)框架。只是来自从事框架/平台设计约 10 年的人的建议。
  • 或者,只要切换到 Python,你就永远不会回头(眨眼)。
  • 为什么不看看一些 Java MVC 框架,看看它们是如何工作的?以春天为例……
  • 我建议您使用比 PHP 更多的 OO 语言(如 Ruby 或 Python)。

标签: php oop codeigniter


【解决方案1】:

我注意到的一件事是,框架通常是为特定目的而构建的。通用框架(如 CodeIgniter)适用于较小的站点,并且可以快速启动和运行。然而,一旦你有了特定的东西,你自己构建的通用框架之外的东西就会成为现实。

我唯一建议的是保持一致。这是无情的一致。如果您决定用 camelCase 命名事物,请不要偏离它。或者,如果您决定使用命名方法的 NounVerb 约定,即 spaceJump,那么即使当时“听起来”更好,也不要切换到 jumpSpace

选择您接受参数的方式并保持一致。你会只接受参数还是参数的关联数组?选择并坚持下去。

在你写任何东西之前,我也不会过度设计。在你需要重构之前,一致性的事情会让你走得很远......但我也不会害怕这样做。 (一两个单元测试应该可以缓解这些恐惧)。

是的,只要你始终如一,做事通常没有对错之分。我有没有提到...

保持一致!

【讨论】:

    【解决方案2】:

    构建技术框架需要大量经验(无意冒犯),并且已经有 1'000 个 CMS/基本对象(会话管理、ORM 等)框架/库。

    与其浪费宝贵的时间(不再冒犯),你最好这样做:

    1. 评估并选择更适合您需求的框架(有些具有非常好的 OO 架构)。
    2. 学会使用这个优秀的框架。
    3. 构建您的自己的 OO 业务/应用程序框架。 (在这里您可以学习、区分和创造价值)。

    【讨论】:

    • 只有业务逻辑的框架。以 stackoverflow 为例:构建/扩展一个框架来实现一个“徽章/声誉系统”(如果你做得对,你肯定会成功并且你会玩得开心)。所有规则都是“业务”逻辑(它具有价值)。您如何将数据保存在数据库、cookie 等中。将其留给技术框架(它没有价值)。 :)
    【解决方案3】:

    您可以构建自己的,但为什么不利用可用框架中包含的大量库,并在需要时扩展它们的功能。

    为什么不看看 Zend 框架。

    它上手相当快,并且包含许多有用的库和标准类。如果您只是想获得更多 OOP 经验,这对个人项目很有用。

    http://framework.zend.com/

    【讨论】:

      【解决方案4】:

      我会看Kohana。它来自 CodeIgnitor,加载模型等就按照你建议的方式完成。

      查看它们的核心功能,其中许多与您的问题直接相关(我已经强调了这些):

      Kohana 有何不同?

      虽然 Kohana 重用了许多常见的设计模式和概念,但还是有一些事情让 Kohana 脱颖而出:

      1. 由社区而非公司驱动。 Kohana 开发由一群敬业的人推动,他们需要一个框架来提供快速、强大的解决方案。
      2. 严格的 PHP 5 OOP。提供许多好处:可见性保护、自动类加载、重载、接口、抽象和单例。
      3. 极其轻便。 Kohana 不依赖于 PECL 扩展或 PEAR 库。避免使用大型的单体库,以支持优化的解决方案。
      4. GET、POST、COOKIE 和 SESSION 数组都按预期工作。 Kohana 不会限制您对全局数据的访问,但会提供过滤和 XSS 保护。
      5. 真正的自动加载类。真正按需加载类,因为它们在您的应用程序中请求。
      6. 没有命名空间冲突。所有类都有后缀,以允许组件之间使用相似的名称,以实现更连贯的 API。
      7. 级联资源提供了无与伦比的可扩展性。几乎 Kohana 的每个部分都可以在不编辑核心系统文件的情况下进行重载或扩展。模块允许将多文件插件透明地添加到您的应用程序中。
      8. 库驱动程序和 API 一致性。库可以使用不同的“驱动程序”来透明地处理不同的外部 API。例如,可以使用多个会话存储选项(数据库、cookie 和本机),但它们都使用相同的接口。这允许为现有库开发新的驱动程序,从而保持 API 的一致性和透明性。
      9. 强大的事件处理程序。观察者风格的事件处理程序允许极端程度的定制潜力。
      10. 快速的开发周期。快速开发可以更快地响应用户的错误和请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2011-10-28
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多