到目前为止,我对PHP非常陌生,并且一直在努力学习它。不过,我面临的一个大困难是,我无法低下头来思考PHP网站是如何由类、对象、名称空间构成的。
我对OOP并不完全陌生,因为我在Python和Java方面确实有一些经验,但是PHP只是让我感到困惑。我看到的许多新手PHP书籍都是关于过程PHP的。我跟踪他们做了1-2个小网站,但当我到OOP,我只是卡住了,任何技巧,你如何从程序过渡到OOP将不胜感激。特别是这些都是我此刻脑海中的问题。
谢谢。
发布于 2011-04-23 16:02:49
你有问题,这是我的答案!
编辑
如果你说的是减少包含的数量,那么是的,自动修整课网站上的内容是你想要看到的!
尽管如此,如果您不想从项目中从头开始,那么就有太多的PHP框架可供选择:
维基百科Web应用框架的比较: PHP
发布于 2011-04-23 17:06:24
这是一个非常有趣的问题,它让我们回到了一个由来已久的关于过程编程与面向对象编程的争论。为什么选一个或另一个?is..nobody的答案有一个。软件设计的全部目的是完成一些事情。你怎么到那里有关系吗?那得看情况了。如果你非常草率地到达那里,并且需要进行大量的更新,那就是浪费时间。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");无论如何,我说的不仅仅是PHP,而是一般的OO原则,但这是一个无法回答的问题。您设计了应用程序完成工作所需的类。在PHP中使用对象的一个很好的例子是菲他尔,一种模板语言。您的网页可能如下所示:
$page = new PHPTAL('mytemplate.xhtml');
echo $page->execute();PHPTAL类负责从模板文件构建html。这就是一个对象可能被用来做什么的例子。
当然,PHPTAL是巨大的,它被分解成很多的隔间。看看源代码,我们看到了Attr、Element、Node等类。这些都是xml文档的一部分,它们有一个类来表示它们。
OOP的一个重要部分是让对象一起工作。每个对象都应该有一个目的,并做它擅长的事情。我不喜欢像“用户”或“书”这样的名词的模型对象,除非它们能做些什么。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框架。我推荐科哈纳,因为它是一个很好的OO框架。我并不一定建议您从它构建一个网站,但请查看文档和代码,以便更好地理解面向PHP的OO开发。
2 菲他尔或其他模板引擎是减少html复制的一种很棒的方法。即使是我上面的小型anypage类也是一个例子。您不必有一个html文件,然后使用require()、include()或virtual()将其传递到代码中以供重用。相反,您可以使用一个包装器来存储和构建通用模板html。为此,我再怎么强调我有多爱PHPTAL。XSLT是另一种选择。
3没有固定的方法去做这件事。其他人则建议“使用一个框架”。我不一定不同意。使用框架在处理一些烦人的设置事务方面有很大帮助。它不是一个神奇的问题解决安慰剂,但它是很好的一些事情。如果你只是试着学习,而且没有时间限制,我想写你自己的框架。这肯定会教你如何用PHP进行OO编程。如果时间是个问题,请使用其他人建议的500,000个框架中的一个。至于如何构造您的网站,我倾向于有一个用于javascript的_js文件夹和一个用于样式表的_stylesheets文件夹。我使用的所有php和xhtml模板文件都放在逻辑上属于它们的文件夹中。这不是火箭科学,而是软件工程!
发布于 2011-04-23 16:06:00
MVC模式本质上是web应用程序的事实模式,不管语言如何。有几个框架使用这种模式,包括Zend、CodeIgniter和Kohana。
就像其他人说的那样,__autoload()或spl_autoload_register()是消除遵循包含/需求的需要的方法。
请记住,OOP的货币是对象。如果您只是简单地将一些后端数据转换为OO模型并将其称为“一天”,那么您将不会获得什么好处。我建议您看Matt的“PHP 5:对象、模式和实践”,以及“四人帮的设计模式:可重用的面向对象软件的元素”,以真正了解如何在整个项目中使用对象。
https://stackoverflow.com/questions/5765164
复制相似问题