待解决的问题:在不了解地图代码的结构下,我们要让玩家自己编辑地图。
思路:对于玩家而言,他熟悉的是水晶矿,高地这些形状,他和系统通过鼠标交互。我们可以设计一个地图编辑器让玩家使用,而无需让他研究绘制地图的细节代码。(实际上暴雪公司就是这样做的,很多玩家甚至暴雪内部人员都是用星际中的地图编辑器制作地图)
正面模式(Facade)示例:
<?php
//玩家的鼠标对象,记录鼠标在编辑其中的状态
class mouse {
//鼠标所处的X轴坐标
public static $X;
//鼠标当前能绘制的对象,比如水晶矿,河流等
public static $object;
//鼠标所处的Y轴坐标
public static $Y;
}
//地图编辑器
class mapEdit {
//绘制方法
public static function draw()
{
//根据鼠标对象的状态在地图上绘制各种东西
//如果是水晶矿
if(mouse::$object == "ore")
{
//调用水晶矿类的绘制方法,这个类定义在下面,这是真正的绘制,但玩家不必学习他的细节
ore::draw();
//如果是河流
}elseif(mouse::$object == "river"){
//调用河流类的绘制方法,这个类定义在下面,这是真正的绘制,但玩家不必学习他的细节
river::draw();
}
}
}
//水晶矿类
class ore {
//剩余的矿,以及其他属性,这里略过
public $remain;
//绘制水晶矿
public static function draw()
{
//实际的绘制水晶矿的底层细节代码
}
}
//河流类
class river {
//绘制河流
public static function draw()
{
//实际的绘制河流的底层细节代码
}
}
//玩家在地图编辑器上点击绘制对象列表上的水晶矿对象
mouse::$object = "ore";
//玩家移动鼠标
mouse::$X = 311;
mouse::$Y = 126;
//在地图上点击,表示绘制当前对象,也就是一个水晶矿
mapEdit::draw();
?>
用途总结:正面模式让使用者集中于他所要进行的工作,而不必知道全部细节,或者说提供了一个容易使用的工具,同时屏蔽了底层细节,不必让使用者重新学习。
实现总结:需要一个类似上面地图编辑器的代码类,帮助玩家方便的进行操作。
通常有一下三种:
代码如下 | 复制代码 |
Location: xxxx:yyyy/zzzz Content-Type: xxxx/yyyy Status: nnn xxxxxx |
常用实例
1.实现重定向(状态码302)
代码如下 | 复制代码 |
<?php |
例子
代码如下 | 复制代码 |
<?php header("Location:http://www.111cn.net/"); //exit(); file_put_contents($_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR."n.txt",'php程序员教程网',LOCK_EX); |
果证明php文件运行过程中如果碰到有header("Location:某个页面URL");这种语句,会直接跳转到另一个页面,但是这里的跳转并没有影响当前php文件的继续执行。也就是是说php header跳转之后,当前页面的脚本会继续执行。如果需要终止脚本运行,需要加exit()或者die()。
但对于有些用法就不需要了
404代码
代码如下 | 复制代码 |
<?php 301 <? |
当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了呢?并且自动做出反应?
那么如何让各家电脑知道自己的盟友被攻击了呢?并且自动做出反应?
待解决的问题:一旦某个电脑被我们进攻,其他电脑就获知,并且自动出兵救援。
思路:为电脑设置一些额外的观察系统,由他们去通知其他电脑。
观察者(Observer)模式示例:
代码如下 | 复制代码 |
<?php //抽象的结盟类 abstractclassabstractAlly{ //放置观察者的集合,这里以简单的数组来直观演示 public$oberserverCollection; //增加观察者的方法,参数为观察者(也是玩家)的名称 publicfunctionaddOberserver($oberserverName) { 以元素的方式将观察者对象放入观察者的集合 $this->oberserverCollection[]=newoberserver($oberserverName); } //将被攻击的电脑的名字通知各个观察者 publicfunctionnotify($beAttackedPlayerName) { //把观察者的集合循环 foreach($this->oberserverCollectionas$oberserver) { //调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者 if($oberserver->name!=$beAttackedPlayerName)$oberserver->help($beAttackedPlayerName); } } abstractpublicfunctionbeAttacked($beAttackedPlayer); } //具体的结盟类 classAllyextendsabstractAlly{ //构造函数,将所有电脑玩家的名称的数组作为参数 publicfunction__construct($allPlayerName) { //把所有电脑玩家的数组循环 foreach($allPlayerNameas$playerName) { //增加观察者,参数为各个电脑玩家的名称 $this->addOberserver($playerName); } } //将被攻击的电脑的名字通知各个观察者 publicfunctionbeAttacked($beAttackedPlayerName) { //调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者 $this->notify($beAttackedPlayerName); } } //观察者的接口 interfaceIoberserver{ //定义规范救援方法 functionhelp($beAttackedPlayer); } //具体的观察者类 classoberserverimplementsIoberserver{ //观察者(也是玩家)对象的名字 public$name; //构造函数,参数为观察者(也是玩家)的名称 publicfunction__construct($name) { $this->name=$name; } //观察者进行救援的方法 publichelp($beAttackedPlayerName) { //这里简单的输出,谁去救谁,最后加一个换行,便于显示 echo$this->name."help".$beAttackedPlayerName."<br>"; } abstractpublicfunctionbeAttacked($beAttackedPlayer); } //假设我一对三,两家虫族,一家神族 $allComputePlayer=array('Zerg1','Protoss2','Zerg2'); //新建电脑结盟 $Ally=newAlly($allComputePlayer); //假设我进攻了第二个虫族 $Ally->beAttacked('Zerg2'); ?> |
途总结:观察者模式可以将某个状态的变化立即通知所有相关的对象,并调用对方的处理方法。
实现总结:需要一个观察者类来处理变化,被观察的对象需要实现通知所有观察者的方法
代码如下 | 复制代码 |
|
原文来自:phpddt.com
declare是PHP的流程控制结构,directive目前支持两个指令【ticks和encoding】,ticks的使用需配合register_tick_function函数(当然还有unregister_tick_function函数)使用。declare 结构用来设定一段代码的执行指令,它的语法结构如下:
declare (directive)
statement
不懂?通俗解释如下:
ticks参数表示运行多少语句调用一次register_tick_function的函数。
register_tick_function函数定义了每个tick事件发生时的处理函数。那么什么是tick事件呢?
tick是一个事件。
tick事件在PHP每执行N条低级语句就发生一次,N由declare语句指定。
可以用register_tick_function()来指定tick事件发生时应该执行的操作。
问题又来了,什么是低级语句呢?它包括:
简单语句:空语句(就一个;号),return, break, continue, throw, goto, global, static, unset, echo, 内置的HTML文本,分号结束的表达式等均算一个语句。
复合语句:完整的if/elseif, while, do...while, for, foreach, switch, try...catch等算一个语句。
语句块:{} 括出来的语句块。
最后特别的:declare块本身也算一个语句(按道理declare块也算是复合语句,但此处特意将其独立出来)。
看一个简单的例子:
代码如下 | 复制代码 |
/** |
上面这段程序的运行结果:
PHP declare控制符及ticks详细教程对结果解释下:
第一次进入for循环,执行echo后执行第一次do_tick函数;
第一次for循环结束后;执行第二次do_tick函数;
循环四次......;
第五次进行for循环,条件不满足,for循环结束,执行一次do_tick函数;
declare本身也是一条语句,也要执行一次do_tick函数。
从上可以看出,declare和ticks可以用来做调试或性能测试。