在PHP的论坛中总是听到有人对PHP的OOP支持说三道四的,说这有缺陷,那里缺乏,但是都拿不出实践的例子。原来说过要和群众说说这事,但是不断很忙,如今算是抽了些工夫了,所以把我刚刚做过的一个项目标框架拿出来和群众探讨一下。这个项目99%的代码是用oop方式编写的,觉得PHP关于OOP支持十分好,不是普通的好,是十分的好。有由于项目本身是一个商业项目所以源代码不好揭晓出来,但是根本框架照旧能够说一说的,并且经历简化的例子更容易了解一些。假如你对PHP中的OOP还不太明白,照旧就此打住吧,先去看看手册,或许根底读物再来看也不迟,反正这个是贴子没有长腿也跑不了。
长话短说,立刻开端吧。我这里会用到一个容易的例子,只要一个半的功用。一个是向阅读器发送一句"Hello, I can say OOP in PHP world!",另外半个功用是从数据库中举行一个查询然后输出到阅读器,说它是半个功用是由于只是作为一个例子讲讲没有实践的数据库操作。
最先从我的第一个文件index.php 开端引见吧。我的index.php文件是这样的:
<?php
include_once ('config.php');
include_once ('class.Application.php');
$app = & new Application();
$app->run();
?>这个就是所有了,虽然只要4行,但是假如用OOP的方式写这个应该就够了吧。
有一点体会的哥们会发觉这里只用到了一个Application 对象,那么必须很想知晓这个对象终究长什么样呢?我们继续看看class.Application.php 这个文件的内部。从以上的代码中我们知晓她应该至少包含两个办法——Application()和run()。所以大体上应该长成这样:
延伸阅读
- PHP框架之SpeedPHP
- PHP框架之Zoop Framwork
- PHP框架之Seagull framework
- PHP框架之Prado
- PHP框架之FleaPHP
- PHP框架之Zend Framework
- PHP框架之Yii
- PHP框架之ThinkPHP
- PHP框架之Solar
- PHP框架之CodeIgniter
<?php
class Application
{
function Application()
{
function run()
}
}
?>如今就算知晓Application 是什么样,它似乎也没有办法完成我们事先设定的功用呀? 所以还要引见一下如何运转这个顺序,在我的构造中一切的页面都是议决index.php和一个action参数举行拜访的比方第一个功用应该这样拜访index.php?action=Hello,而第二个功用则是议决index.php?action=Database举行拜访。这样的构造群众也许并不陌生吧。所以index.php 页面应当知晓传进来的 action 参数是什么,也就是说Application对象应当知晓 这个action 参数是什么。所以我们需要给Application添加一个办法 getAction()来获得action参数。既然知晓action,知晓了要做什么,那么办法 run()也就有知晓如何去run了。
同时我还能够把(完成功用的)每一个页面作为一个对象来看待,所以我应该至少还需要两个类 :class Hello 和 class Database 。由于这两个对象开头都是向阅读器发送页面所以把他们共同的局部提出来作为他们的父类
class
以下是三个类文件的内容
class..php
<?php
class
{
function ()
{ }
function show()
{
//不能直接调用这个办法必需要在子类中去细致完成。
die('You can not use this funciton directly from class');
}
}
?>其中这个show办法应该是一切页面对象都具有的办法,只是在完成上有所不一样。
延伸阅读
- PHP框架之SpeedPHP
- PHP框架之Zoop Framwork
- PHP框架之Seagull framework
- PHP框架之Prado
- PHP框架之FleaPHP
- PHP框架之Zend Framework
- PHP框架之Yii
- PHP框架之ThinkPHP
- PHP框架之Solar
- PHP框架之CodeIgniter
class.Hello.php
<?php
require_once (\"class..php\");
class Hello extends
{
function Hello()
{
parent : age();
}
function show()
{
echo \"Hello, I can say OOP in PHP world!\";
}
}
?>;class.Database.php
<?php
require_once (\"class..php\");
class Database extends
{
function Database()
{
parent: age();
}
function show()
{
//做一些数据库操作然后将后果显示出来。
}
}
?>;同时我们还遵守这样的一条准绳:action的值和调用的页面类的称号坚持一致,比方当action=Hello的时分顺序就知晓需要原始化一个Hello的对象,有了这样的准绳和以上的多个文件我们就能够将 Application 类改进成这样。
<?php
class Application
{
function Application()
{ }
function getAction()
{ }
function run()
{
$Class = $this->;getAction();
include_once (\"class.\".$Class.\".php\");
$ = & new $Class();
$->;show();
}
}
?> 延伸阅读
- PHP框架之SpeedPHP
- PHP框架之Zoop Framwork
- PHP框架之Seagull framework
- PHP框架之Prado
- PHP框架之FleaPHP
- PHP框架之Zend Framework
- PHP框架之Yii
- PHP框架之ThinkPHP
- PHP框架之Solar
- PHP框架之CodeIgniter
为什么getAction()空着?由于它太容易了,你自己能够轻轻松松地把它写出来呀。 看到这里,假如你还不太明白,不用急,能够停下来重新再看一遍。 假如全明白了,我们就继续行进。我们尚有半个职务没有完成,所以我们需要改进我们的Application和页面类,让它完成数据库操作功用。
举行数据库操作之前最先应当得到一个正确的数据库衔接,假如让每个需要数据库衔接的页面类去做这样的职务真实是一件十分费时费力的职务,不容易维护维护并且也破坏了oop的设计初衷,举行数据库操作的页面类比方 Database 只应当完成它份内职务即获得数据。 细心看看我们的设计不难发觉树立数据库衔接的职务交给 Application 来做最合适不过了, 所以给Application 添加一个新的成员 $db 并且在原始化的时分将树立的数据库衔接赋值给它。
<?php
require_once (\"class.Database.php\");
class Application
{
var $db;//数据库对象
function Application()
{
$this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);//$db 如今是一个数据库对象了
}
function getAction()
{
return $_GET['action']; //容易的完成 getAction;
}
funciton & getDatabase()
{
return $this->;db;
}
function run()
{
$Class = $this->;getAction();
include_once (\"class.\".$Class.\".php\");
$ = & new $Class($this); //这里是独一做了手脚的地点,将这个Application对象传给页面对象。
$->;show();
}
}
?> 延伸阅读
- PHP框架之SpeedPHP
- PHP框架之Zoop Framwork
- PHP框架之Seagull framework
- PHP框架之Prado
- PHP框架之FleaPHP
- PHP框架之Zend Framework
- PHP框架之Yii
- PHP框架之ThinkPHP
- PHP框架之Solar
- PHP框架之CodeIgniter
你如今不用太关心这个 Database对象从何而来如何完成,知晓它是一个含有限据库衔接的对象就能够了,
假如用过phplib, ADODB,或许Pear库的就很容易了解。
这个语句:
$this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);
就是树立一个数据库衔接而已。
至于DB_HOST,DB_NAME,DB_LOGIN,DB_PASS 这些都是常量我们在config.php中曾经事先设定。
由于数据库操作页面 Database 需要举行数据库衔接所以它也需要一个变量 $db 来保管数据库对
象,所以我们需要把Database改进成这样:
class.Database.php
php
require_once (\"class..php\");
class Database extends
{
var $db;
function Database(&$app)//将Application对象作为参数接受。
{
parent : age();
$this->;db = $app->;getDatabase();//获得 Application 中的数据库对象。
}
function show()
{
$sql = 'SELECT * FROM sale_orders';//容易的一个 SQL 例子。
$results = $this->;db->;query($sql);//query 是 Database对象的一个公共的办法,议决它向数据库提交SQL查询。
...;//做一些操作把得到的后果显示出来。
}
}
?>好了,一个半的功用算是完成了,PHP关于OOP支持得也很好看吧,构造明晰,维护简约,至于效率嘛,我可没看出来有什么耗损,假如你有兴味能够自己测试一下。用这样的框架能够轻轻松松应对各种需求的改动:添加各种权限控制,别离数据库层,商业逻辑,和表象层,添加远程调用接口统统不成疑问,只是这里真实写不完这么多的东西。真不知晓谁还会有理由说PHP 中OOP 很烂呢?
另外,需要提示群众的是传递对象和赋值的时分要运用 & 符号这样能够保证每次引用的是同一个对象。
延伸阅读
- PHP框架之SpeedPHP
- PHP框架之Zoop Framwork
- PHP框架之Seagull framework
- PHP框架之Prado
- PHP框架之FleaPHP
- PHP框架之Zend Framework
- PHP框架之Yii
- PHP框架之ThinkPHP
- PHP框架之Solar
- PHP框架之CodeIgniter
读库教程网文章由网络收集后整理发布,文章发布人拥有该内容的所有权力及责任!
如果你喜欢这页,可以按Ctrl+D收藏起来。







