到目前为止,我对PHP非常陌生并一直在努力学习它。我面临的一个很大困难是,我无法全神贯注地思考如何使用类,对象,命名空间构建PHP网站。
我不是全新的OOP,因为我在Python和Java方面有一点经验但是PHP OOP让我感到难过。我看到的许多新手PHP书都是关于程序化PHP的。我跟着他们制作了1--2小网站但是当我到OOP时,我只是被卡住了,关于你如何从程序转换到OO PHP的任何提示都将不胜感激。特别是这些是我此刻想到的问题
感谢。
答案 0 :(得分:3)
你有疑问,这是我的答案!
您在PHP中创建的类可以与User,Book等对象相关,就像在持久性程序中一样。如果你看一下像Code Igniter这样的框架,你就可以创建一个特定的类来构建数据库查询到一个类,该类使用由多个类组成的MVC架构来呈现整个网站。
为了减少代码重复,您可以编写一个类来构造一个表(或者如果您真的喜欢div表制造者。)。然后你可以编写makeRow(),makeDivision()等方法......真的很花哨然后你就可以编写干净的PHP代码来生成非常强大的页面。
的修改:
如果你在谈论减少你必须为课程做的包含数量,那么是的,PHP网站上的Autoloading Classes是你想要看的东西!
您网站的结构可以基于您要使用的模型。现在看来MVC模型很受框架的欢迎,但是你需要如何制作你的网络应用程序。我相信你可以采用任何架构模型并围绕它建立你的网站。
尽管如此,如果你不想从项目的绝对划痕开始,有很多PHP框架可供选择:
Comparison of Web application frameworks: PHP通过维基百科
答案 1 :(得分:2)
一个非常有趣的问题,让我们回到程序与OO编程的古老争论。为什么选择其中一个?答案是......没人有。设计软件的整个目的是完成一些事情。你怎么到达那里是否重要?这得看情况。如果你到达那里非常邋and并且需要进行大量更新,那就太浪费时间了。 OO编程是否会阻止这种情况?绝对不是。
看起来您真正的问题是如何将OO集成到网站中。这真的不是你应该做的事情。你想通过这个网站实现什么目标?它是否包含许多不同的应用程序状态以及FSM中的用户交互,或者它只是一堆静态页面。这些页面分享了多少信息?
让我们先解决您的具体问题:
您可以构建一个非常简单的类来显示标准网页:
class anypage {
public function header() {
return '<head></head>';
}
public function footer() {
return '<br />Copyright © ' . 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)
这取决于您想要完成的任务。在相对复杂的Web应用程序中,您可以遵循典型的MVC approach。在这种情况下,您可以创建至少两个类,一个用于模型,另一个用于控制器。然后有几个模板(普通的PHP文件),其内容由控制器填充/完成。您可以根据需要创建更多类(表单,实用程序,代码生成器......),但要小心保持代码紧凑且易于维护。
许多框架都依赖于__autoload()
魔术方法。另一种方法是构建你的机制来处理所有这些东西,可能使用AutoLoader
类。
使用框架。认真。或者至少以框架为例。由于其结构简单,我建议CakePHP或CodeIgniter。