OOP PHP混乱,从程序转换到OO PHP

时间:2011-04-23 15:46:16

标签: php oop

到目前为止,我对PHP非常陌生并一直在努力学习它。我面临的一个很大困难是,我无法全神贯注地思考如何使用类,对象,命名空间构建PHP网站。

我不是全新的OOP,因为我在Python和Java方面有一点经验但是PHP OOP让我感到难过。我看到的许多新手PHP书都是关于程序化PHP的。我跟着他们制作了1--2小网站但是当我到OOP时,我只是被卡住了,关于你如何从程序转换到OO PHP的任何提示都将不胜感激。特别是这些是我此刻想到的问题

  1. 通常会创建什么类型的课程?我想为我的数据库(User,Book)中的每个表以及表单类提供一个类,是否还有其他类型的候选者可以转换为类?
  2. 除了旧的通常require()和include()之外,还有其他减少HTML代码重复的方法吗?
  3. 构建典型PHP网站的任何推荐方法?我目前只知道有一个包含文件的文件夹。但我想知道更多。
  4. 感谢。

6 个答案:

答案 0 :(得分:3)

你有疑问,这是我的答案!

  1. 您在PHP中创建的类可以与User,Book等对象相关,就像在持久性程序中一样。如果你看一下像Code Igniter这样的框架,你就可以创建一个特定的类来构建数据库查询到一个类,该类使用由多个类组成的MVC架构来呈现整个网站。

  2. 为了减少代码重复,您可以编写一个类来构造一个表(或者如果您真的喜欢div表制造者。)。然后你可以编写makeRow(),makeDivision()等方法......真的很花哨然后你就可以编写干净的PHP代码来生成非常强大的页面。

    修改
    如果你在谈论减少你必须为课程做的包含数量,那么是的,PHP网站上的Autoloading Classes是你想要看的东西!

  3. 您网站的结构可以基于您要使用的模型。现在看来MVC模型很受框架的欢迎,但是你需要如何制作你的网络应用程序。我相信你可以采用任何架构模型并围绕它建立你的网站。

    尽管如此,如果你不想从项目的绝对划痕开始,有很多PHP框架可供选择:
    Comparison of Web application frameworks: PHP通过维基百科

答案 1 :(得分:2)

一个非常有趣的问题,让我们回到程序与OO编程的古老争论。为什么选择其中一个?答案是......没人有。设计软件的整个目的是完成一些事情。你怎么到达那里是否重要?这得看情况。如果你到达那里非常邋and并且需要进行大量更新,那就太浪费时间了。 OO编程是否会阻止这种情况?绝对不是。

看起来您真正的问题是如何将OO集成到网站中。这真的不是你应该做的事情。你想通过这个网站实现什么目标?它是否包含许多不同的应用程序状态以及FSM中的用户交互,或者它只是一堆静态页面。这些页面分享了多少信息?

让我们先解决您的具体问题:

  1. 通常会创建什么类型的课程?无论他们想要什么类型的课程!在键入一个代码字符之前,您应该坐下来为您的应用程序编写一个设计。没有人能告诉你如何做到这一点:编写一些文档,伪代码(如果你愿意,甚至在php中),绘制UML图等。找出你的应用程序如何划分。除非有意义,否则不要错误地将对象基于它们在现实世界中的逻辑分离(用户,书籍)进行分割。为什么需要Book对象?它如何与用户互动?
  2. 您可以构建一个非常简单的类来显示标准网页:

    class anypage {
       public function header() {
          return '<head></head>';
       }
       public function footer() {
          return '<br />Copyright &copy; ' . date('Y');
       }
       public function render($body) {
          return '<html>' . $this->header() . "<body>$body{$this->footer()}</body></html>";
       }
    }
    

    然后在任何页面呼叫:

    $page = anypage;
    echo $page->render("My Page Content");
    

    无论如何,我更多地谈论的是一般OO原则而不仅仅是PHP,但这是一个无法回答的问题。您可以设计应用程序完成工作所需的类。在PHP中使用对象的一个​​很好的例子是PHPTAL,一种模板语言。您的网页可能如下所示:

    $page = new PHPTAL('mytemplate.xhtml');
    echo $page->execute();
    

    PHPTAL类负责从模板文件构建html。这是一个对象可能用于的例子。

    当然,PHPTAL是巨大的,它被分解成很多隔间。看一下源代码,我们看到类Attr,Element,Node ..这些都是xml文档的一部分,它们有一个代表它们的类。

    OOP的一个重要部分是让对象协同工作。每个对象都应该用于一个目的并做它擅长的事情。我不喜欢像“User”或“Book”这样的名词模型的对象,除非他们做某事。 PHPTAL在为页面呈现视图方面做得很好,但是您如何知道要呈现哪个页面?您可以使用对象来处理:

    class controller {
       public function __call($_, $_) { return $this->hello(); }
       public function hello() {
          session_start();
          $view = new PHPTAL('hello.xhtml');
          return $view->execute();
       }
       public function goodbye() {
          session_destroy();
          $_SESSION = array();
          $view = new PHPTAL('goodbye.xhtml');
          return $view->execute();
       }
    }
    

    在您的主页上,您将拥有:

    $c = new controller;
    echo $c->$_REQUEST['action']();
    

    如果请求设置了'action',则控制器通过调用该动作进行相应的响应。默认情况下使用hello,感谢神奇的__call()

    与您熟悉的其他OO语言类似,您甚至可以在PHP中使用事件:

    class controller {
       private $models = array();
       private $_listeners = array();
       public function __construct() {
          $model = new model;
          $this->models[] = $model;
          $this->_listeners[] = $model;
       }
    
       public function action($action = 'hello', $events = array()) {
          $this->$action();
          foreach ($events as $type => $data) {
             foreach ($this->_listeners as $listener) {
                $event = "fire_" . $type;
                $listener->$event($data);
             }
          }
       }
    }
    
    class model {
       public function fire_hello($name) {
          echo 'hello ' . $name;
       }
    }
    

    正如其他答案所暗示的那样,一个好的开始就是看看PHP框架。我推荐Kohana,因为它是一个很好的OO框架。我不一定建议你从中构建一个网站,但是看一下文档和代码,以便更好地理解PHP的OO开发。

    2 PHPTAL或其他模板引擎是减少html重复的绝佳方法。即使我上面的微型anypage类也是一个例子。您不一定要拥有html文件,然后使用require() include()virtual()将其传递到您的代码中以便重复使用。相反,您可以拥有一个存储和构建通用模板html的包装器。我不能强调我为此目的多么喜欢PHPTAL。 XSLT是另一种选择。

    3没有固定的方法可以做到这一点。其他人则建议“使用框架”。我不一定反对。使用框架可以帮助解决一些烦人的设置事务。这不是一个解决问题的神奇安慰剂,但对某些事情来说这很好。如果你只是想学习并且没有时间限制,我说要编写自己的框架。这肯定会教你PHP中的OO编程。如果时间问题,请使用其他人建议的500,000个框架之一。至于如何构建您的网站,我倾向于有javascript的_js文件夹和样式表的_stylesheets文件夹。我使用的所有php和xhtml模板文件都只是放在逻辑上属于它们的文件夹中。这不是火箭科学,它是软件工程!

答案 2 :(得分:1)

MVC模式本质上是Web应用程序的事实模式,无论语言如何。一些框架使用这种模式,包括Zend Framework,CodeIgniter和Kohana。

就像其他人所说的那样,__ autoload()或spl_autoload_register()是消除跟随包含/需要的必要条件。

请记住,OOP的货币是对象。如果您只是将一些后端数据转换为OO模型并将其称为一天,那么您获得的收益并不高。我建议你看看Matt Zandstra的书 PHP 5:对象,模式和实践以及Gang of Four的设计模式:可重用的面向对象软件的元素了解如何在整个项目中使用对象。

答案 3 :(得分:0)

您可能会发现在框架内工作意味着您自己只创建了一些组件,并且有大量最佳实践示例。

我从程序化的东西转移到Zend Framework这是一个很棒的框架,并且包含一个完整的MVC模型,它有助于清楚地定义不同对象应该做什么以及它们如何组合在一起。

这可能是一个学习曲线,但过了一段时间它比程序性的东西更有意义!

答案 4 :(得分:0)

使用面向对象的MVC框架,如CodeIgniter(非常简单),Yii(有点难),或CakePHP或Symfony(更难)。您可以看到不同对象如何相互链接,以及使用它们带来的好处。

类的一个很好的例子是“表单”,“验证”和“架构”之间的交互。您可以通过传递一个模式来实例化一个表单,然后使用“表单”中的方法生成HTML而无需反复编写它。当用户提交表单时,使用“验证”类的实例化验证每个字段,然后使用“模型”将其写入数据库。数据库中的每个表都有一个“模型”,它定义了如何将数据写入数据库并从数据库中检索(CRUD)。

您可以避免使用大量的要求,并且包括使用'__autoload()'。

答案 5 :(得分:0)

  1. 这取决于您想要完成的任务。在相对复杂的Web应用程序中,您可以遵循典型的MVC approach。在这种情况下,您可以创建至少两个类,一个用于模型,另一个用于控制器。然后有几个模板(普通的PHP文件),其内容由控制器填充/完成。您可以根据需要创建更多类(表单,实用程序,代码生成器......),但要小心保持代码紧凑且易于维护。

  2. 许多框架都依赖于__autoload()魔术方法。另一种方法是构建你的机制来处理所有这些东西,可能使用AutoLoader类。

  3. 使用框架。认真。或者至少以框架为例。由于其结构简单,我建议CakePHPCodeIgniter