仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1672|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之从魔兽争霸看PHP设计形式

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:51:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
看到好的帖子最好up一下,以使得更多的人得到分享。前段工夫看到有人用魔兽来注释设计形式,感到很成心思,因而我把它改了改,又添加了些设计形式内容,明天收回来。有些中央自创了后人的内容,没有注明,请后人不要见责啊。   这里用人人感乐趣的魔兽3来会商PHP的几种罕见的设计形式:单件形式、战略形式、工场形式、察看者形式。明天就讲这四个吧,今后持续。
这些设计形式,都是针对面向对象来讲的,所以都用PHP5,别的在这里我想说的是PHP4从2008年8月8日(我记得是和北京奥运会统一天,没查证,呵呵)的时分官方就发了最初一个PHP4的补钉,这意味这PHP4的时期已终结,所以,我建议人人如今就别理PHP4吧,就以PHP5来讲吧。
1、单件形式:
成绩的提出:
某些使用法式资本是独有的,由于有且只要一个此类型的资本。例如,经由过程数据库句柄到数据库的毗连是独有的。您但愿在使用法式中同享数据库句柄,由于在坚持毗连翻开或封闭时,它是一种开支,在获得单个页面的过程当中更是如斯。
成绩的处理:
那末上面咱们就入手下手玩魔兽吧。起首双击war3.exe,这时候候就入手下手运转魔兽了。咱们用代码来完成吧。
<?php
class War3
{
public function __construct()
{
echo "War3 is Running.","<br />";
}
}
$war = new War3();
运转!很好,输入
War3 is Running.
咱们已可以入手下手游戏了,然而,假如我在代码末尾再到场
$war2 = new War3();
$war3 = new War3();
会怎样呢?咱们尝尝,输入了局:
War3 is Running.
War3 is Running.
War3 is Running.
完了,假如不当心双击了两次就开了3个魔兽,那假如再双击几回,那电脑一定爆失落。。。咱们仍是来想一想处理办法吧。
既然咱们不克不及这么随便的就把这个类实例化了,那末咱们就把机关函数改成公有办法。
class War3
{
private function __construct()
{
echo "War3 is Running.","<br />";
}
}
可是公有变量内部是没法会见的,如许以来,咱们就连一个都打不开了啊。别急,咱们再给他加一个不必经由过程实例化,内部也能会见的函数,那就是静态函数,
class War3
{
private function __construct()
{
echo "War3 is Running.","<br />";
}
public static function runWar()
{
}
}
经由过程这个静态的办法runWar()咱们来掌握类War3的实例化,那末还缺上一个标识,咱们再创立一个标识,经由过程这个标识来暗示咱们的类是不是已实例化,假如实例化,直接前往句柄就好了。
把类修正成
class War3
{
protected static $_instance = null;
private function __construct()
{
echo "War3 is Running.","<br />";
}
public static function runWar()
{
if (null === self::$_instance) {
self::$_instance = new self();
}

return self::$_instance;
}
}
固然,咱们运转魔兽时的实例化也要换种办法,就经由过程
$war = War3::runWar();
就可以入手下手玩魔兽了,好了,上面把完全的代码附下去:
<?php
class War3
{
protected static $_instance = null;
private function __construct()
{
echo "War3 is Running.","<br />";
}
public static function runWar()
{
if (null === self::$_instance) {
self::$_instance = new self();
}

return self::$_instance;
}
}
$war = War3::runWar();
$war2 = War3::runWar();
$war3 = War3::runWar();
运转一下,了局是:
War3 is Running.
太好了,我双击了这么屡次,也就只运转了一个魔兽,如今随意你怎样翻开,机子都不会爆失落了。
这就是传说中的单价形式,次要用于一些很占资本的并且实例唯一一个实例就够用的器材,好比,zend framework中的Zend_Controller_Front前端掌握器,就是采取单价形式来设计的,人人有乐趣的话可以看看谁人。
2、战略形式:
成绩的提出:
在此形式中,算法是从庞杂类提取的,因此可以便利地交换。例如,假如要更改搜刮引擎中分列页的办法,则战略形式是一个不错的选择。思虑一下搜刮引擎的几个局部 —— 一局部遍历页面,一局部对每页分列,另外一局部基于分列的了局排序。在庞杂的示例中,这些局部都在统一个类中。经由过程利用战略形式,您可将分列局部放入另外一个类中,以便更改页分列的体例,而不影响搜刮引擎的其他代码。
成绩的处理:
呵呵,不讲那末庞杂,方才魔兽十分困难翻开了,咱们仍是玩魔兽好了。
上面咱们选battle,哇很多多少种族啊,有人族(Human),兽族(ORC),暗夜精灵族(Nighy Elf),不逝世族(Undead)。我选精灵族(Nighy Elf),再选一个精灵族和两个兽族(ORC),一个兽族和我是一家的,另外一个精灵族和兽族是另外一家的。
每个玩家在进入游戏后城市失掉一些资本,如一个大厅,五个小精灵(苦工)和一个矿山。这些可以称为是初始化的一些器材,这里咱们就能够用到战略形式来封装这些初始化。
进入正题,起首咱们来构建一个玩家类:
<?php
class player
{
//玩家名字
protected $_name;
//种族
protected $_race;
//步队
protected $army;
//修建
protected $building;
//生齿
protected $population;
//黄金
protected $gold;
//木材
protected $wood;
//机关函数,设定所属种族
public function __construct($race)
{
$this->race = $race;

}
//__get()办法用来获得回护属性
private function __get($property_name)
{
if(isset($this->$property_name)) {
return($this->$property_name);
}
else {
return(NULL);
}
}
//__set()办法用来设置回护属性
private function__set($property_name,$value)
{
$this->$property_name=$value;
}
}
接着,咱们再建一个玩家初始化的接口,
<?php
interface initialPlayer
{
//制作初始化的军队
public function giveArmy($player);
//制作初始化的修建
public function giveBuilding($player);
//初始化资本
public function giveSource($player);
}
好了,到这里咱们就该对这个接口来完成了,为了便利,我只选了两个种族,就只写这两个种族的初始化了:
起首是精灵族:
<?php
class NighyElfInitial implements initialPlayer
{
//制作初始化的军队
public function giveArmy($player)
{
//五个小精灵
for($i=0; $i<=5;$i++)
{
$creator = new CreatArms();//这个是创立军队类,在前面得工场形式中会用到,这里我就不多说了
$player->army[] = $creator->Creat('Wisp','./Arms/');
}
}
//制作初始化的修建
public function giveBuilding($player)
{
$creator = new CreatBuildings();
//一个基地
$player->building[] = $creator->Creat('TownHall','./Buildings/');
//一个矿场
$player->building[] = $creator->Creat('Mine','./Buildings/');
}
//初始化生齿下限
public function giveSource($player)
{
$player->population= 10;
$player->gold= 1000;
$player->wood= 100;
}
}
接上去是兽族:
<?php
class ORCInitial implements initialPlayer
{
//制作初始化的军队
public function giveArmy($player)
{
//五个苦工
for($i=0; $i<=5;$i++)
{
$creator = new CreatArms();//这个是创立军队类,在前面得工场形式中会用到,这里我就不多说了
$player->army[] = $creator->Creat('Peon','./Arms/');
}
}
//制作初始化的修建
public function giveBuilding($player)
{

$creator = new CreatBuildings();
//一个基地
$player->building[] = $creator->Creat('TownHall','./Buildings/');
//一个矿场
$player->building[] = $creator->Creat('Mine','./Buildings/');
}
//初始化生齿下限
public function giveSource($player)
{
$player->population= 10;
$player->gold= 1000;
$player->wood= 100;
}
}
<p>终于理解了数据库的概念,而且让你兴奋不已的是你终于可以通过PHP来连接数据库了,这期间你是怎么学会的,我们不去考证了,但是事实证明,你已经可以了。
admin 该用户已被删除
沙发
发表于 2015-2-4 06:30:19 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
冷月葬花魂 该用户已被删除
板凳
发表于 2015-2-5 07:51:34 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
地板
发表于 2015-2-11 07:45:35 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-13 09:57:07 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
老尸 该用户已被删除
6#
发表于 2015-3-3 19:00:11 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
深爱那片海 该用户已被删除
7#
发表于 2015-3-5 00:51:53 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
因胸联盟 该用户已被删除
8#
发表于 2015-3-7 10:28:55 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-14 22:32:54 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
乐观 该用户已被删除
10#
发表于 2015-3-21 07:11:17 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
简单生活 该用户已被删除
11#
发表于 2015-3-24 16:40:52 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
只想知道 该用户已被删除
12#
发表于 2015-3-29 03:30:33 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
飘飘悠悠 该用户已被删除
13#
发表于 2015-4-1 23:04:43 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
柔情似水 该用户已被删除
14#
发表于 2015-4-8 14:53:38 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
分手快乐 该用户已被删除
15#
发表于 2015-4-25 05:10:17 | 只看该作者
爱上php,他也会爱上你。
海妖 该用户已被删除
16#
发表于 2015-5-4 12:48:48 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
莫相离 该用户已被删除
17#
发表于 2015-5-9 12:40:11 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
小妖女 该用户已被删除
18#
发表于 2015-6-7 11:26:39 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
再见西城 该用户已被删除
19#
发表于 2015-6-26 04:55:45 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
山那边是海 该用户已被删除
20#
发表于 2015-6-27 04:02:26 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 18:30

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表