首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OOP PHP混淆,从过程到OO PHP的过渡

OOP PHP混淆,从过程到OO PHP的过渡
EN

Stack Overflow用户
提问于 2011-04-23 15:46:15
回答 6查看 1.1K关注 0票数 4

到目前为止,我对PHP非常陌生,并且一直在努力学习它。不过,我面临的一个大困难是,我无法低下头来思考PHP网站是如何由类、对象、名称空间构成的。

我对OOP并不完全陌生,因为我在Python和Java方面确实有一些经验,但是PHP只是让我感到困惑。我看到的许多新手PHP书籍都是关于过程PHP的。我跟踪他们做了1-2个小网站,但当我到OOP,我只是卡住了,任何技巧,你如何从程序过渡到OOP将不胜感激。特别是这些都是我此刻脑海中的问题。

  1. 你通常会创建什么类型的类?我想为我的数据库中的每个表(用户、书籍)以及可能的表单类提供一个类,还有其他类型的候选对象也可以转化为类吗?
  2. 除了以前的需求()和include()之外,还有其他减少html代码复制的方法吗?
  3. 有什么推荐的方法来构造一个典型的PHP网站吗?目前我只知道有一个包含文件的文件夹。但我想知道更多。

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-04-23 16:02:49

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

  1. 您在PHP中创建的类可以与用户、Book等对象相关,就像在持久性程序中所做的那样。如果您查看像码点火器这样的框架,您可以使一个类具有特定的特性,比如将数据库查询构造为一个类,该类使用由多个类组成的MVC体系结构来呈现整个网站。
  2. 例如,为了减少代码重复,您可以编写一个类来构造一个表(或者如果您真的喜欢div表生成器的话)。然后您可以编写诸如makeRow()、makeDivision()等方法.变得非常漂亮,然后您可以编写干净的PHP代码,这些代码可以生成非常大的强大页面。

编辑

如果你说的是减少包含的数量,那么是的,自动修整课网站上的内容是你想要看到的!

  1. 您的网站结构可以基于您想要使用的模型。现在看来,MVC模型在框架中很受欢迎,但这取决于您希望如何制作您的web应用程序。我相信你可以采取任何建筑模型,并建立你的网站围绕它。

尽管如此,如果您不想从项目中从头开始,那么就有太多的PHP框架可供选择:

维基百科Web应用框架的比较: PHP

票数 3
EN

Stack Overflow用户

发布于 2011-04-23 17:06:24

这是一个非常有趣的问题,它让我们回到了一个由来已久的关于过程编程与面向对象编程的争论。为什么选一个或另一个?is..nobody的答案有一个。软件设计的全部目的是完成一些事情。你怎么到那里有关系吗?那得看情况了。如果你非常草率地到达那里,并且需要进行大量的更新,那就是浪费时间。OO编程能阻止这种情况吗?绝对不是。

看起来你真正的问题是如何将面向对象集成到一个网站中。这真的不是你应该为它做的事情。你想用这个网站做些什么?它是否包含FSM中有用户交互的许多不同的应用程序状态,还是仅仅是一堆静态页面。这些页面共享了多少信息?

让我们先回答你的具体问题:

  1. 一个人通常创建什么类型的类?他们想要的任何类型的课程!在键入一个代码字符之前,您应该坐下来为您的应用程序编写一个设计。没有人能告诉你如何做到这一点:编写一些文档、伪代码(即使是在php中,如果你愿意)、绘制一个UML图等等。不要犯基于现实世界(用户、书籍)的逻辑分离来划分对象的错误,除非它是有意义的。为什么你需要一个Book对象?它是如何与用户交互的?

您可以构建一个非常简单的类来显示您的标准网页:

代码语言:javascript
复制
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>";
   }
}

然后在任何页面调用:

代码语言:javascript
复制
$page = anypage;
echo $page->render("My Page Content");

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

代码语言:javascript
复制
$page = new PHPTAL('mytemplate.xhtml');
echo $page->execute();

PHPTAL类负责从模板文件构建html。这就是一个对象可能被用来做什么的例子。

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

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

代码语言:javascript
复制
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();
   }
}

在你的主页上,你会:

代码语言:javascript
复制
$c = new controller;
echo $c->$_REQUEST['action']();

如果请求设置了“action”,则控制器通过调用该操作进行相应的响应。hello默认使用,这要归功于神奇的__call()

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

代码语言:javascript
复制
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框架。我推荐科哈纳,因为它是一个很好的OO框架。我并不一定建议您从它构建一个网站,但请查看文档和代码,以便更好地理解面向PHP的OO开发。

2 菲他尔或其他模板引擎是减少html复制的一种很棒的方法。即使是我上面的小型anypage类也是一个例子。您不必有一个html文件,然后使用require()include()virtual()将其传递到代码中以供重用。相反,您可以使用一个包装器来存储和构建通用模板html。为此,我再怎么强调我有多爱PHPTAL。XSLT是另一种选择。

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-23 16:06:00

MVC模式本质上是web应用程序的事实模式,不管语言如何。有几个框架使用这种模式,包括Zend、CodeIgniter和Kohana。

就像其他人说的那样,__autoload()或spl_autoload_register()是消除遵循包含/需求的需要的方法。

请记住,OOP的货币是对象。如果您只是简单地将一些后端数据转换为OO模型并将其称为“一天”,那么您将不会获得什么好处。我建议您看Matt的“PHP 5:对象、模式和实践”,以及“四人帮的设计模式:可重用的面向对象软件的元素”,以真正了解如何在整个项目中使用对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5765164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档