问题1:下面的空数组用isset($arr[0]['id']) 判断会不会有notice错误?
问题2:下面的空数组用empty($arr[0]['id'])判断会不会有notice错误?
$arr = array();//定义一个空数组
一直以为isset($arr[0])没有问题,isset($arr[0]['id'])会有notice错误;empty判断前必须有isset的判断要不会有notice错误!
事实是问题1、2的判断都没有问题,也不会有notice的错误,具体的自己可以测试,就不多赘述了。
php程序中验证邮箱,IP地址或url一般大家都会使用正则表达式来处理,其实在php里面有一些内置的专门验证规则。下面用实例说说如何使用php内置filter函数来验证email,ip以及URLPHP:指示支持该函数的最早的 PHP 版本。
函数 | 描述 | PHP |
---|---|---|
filter_has_var() | 检查是否存在指定输入类型的变量。 | 5 |
filter_id() | 返回指定过滤器的 ID 号。 | 5 |
filter_input() | 从脚本外部获取输入,并进行过滤。 | 5 |
filter_input_array() | 从脚本外部获取多项输入,并进行过滤。 | 5 |
filter_list() | 返回包含所有得到支持的过滤器的一个数组。 | 5 |
filter_var_array() | 获取多项变量,并进行过滤。 | 5 |
filter_var() | 获取一个变量,并进行过滤。 | 5 |
1、验证邮箱
代码如下 | 复制代码 |
$email='111cn@163.com'; $result=filter_var($email,FILTER_VALIDATE_EMAIL); var_dump($result); //输出:string(17) '111cn@163.com' |
2、验证url地址
代码如下 | 复制代码 |
$url='http://www.111cn.net/'; $result=filter_var($url,FILTER_VALIDATE_URL); var_dump($result); //输出:string(25) 'http://www.111cn.net/' |
3、验证ip地址
代码如下 | 复制代码 |
$url='192.168.0.1'; $result=filter_var($url,FILTER_VALIDATE_IP); var_dump($result); //输出:string(11) '192.168.0.1' |
php中的filter函数还可用来验证浮点数,整形数字,布尔类型等等,具体可查阅php手册的filter函数或者参照本站如下这篇文章
php header后是否需要书写exit以终止程序,以前一直没有太在意,今天遇到个bug,才发现这还是个问题,特意写了段代码测试了一下,代码如下:
通常有一下三种:
代码如下 | 复制代码 |
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 <? |
星际里面的战斗都是在地图上进行的,只要我们可以编辑地图,就可以创造一些新的战役。可是,星际里面的地图绘制相关的代码如果开放出来,估计大多数万家都看不懂,更不要说自己编辑地图了。
待解决的问题:在不了解地图代码的结构下,我们要让玩家自己编辑地图。
思路:对于玩家而言,他熟悉的是水晶矿,高地这些形状,他和系统通过鼠标交互。我们可以设计一个地图编辑器让玩家使用,而无需让他研究绘制地图的细节代码。(实际上暴雪公司就是这样做的,很多玩家甚至暴雪内部人员都是用星际中的地图编辑器制作地图)
正面模式(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();
?>
用途总结:正面模式让使用者集中于他所要进行的工作,而不必知道全部细节,或者说提供了一个容易使用的工具,同时屏蔽了底层细节,不必让使用者重新学习。
实现总结:需要一个类似上面地图编辑器的代码类,帮助玩家方便的进行操作。
那么如何让各家电脑知道自己的盟友被攻击了呢?并且自动做出反应?
待解决的问题:一旦某个电脑被我们进攻,其他电脑就获知,并且自动出兵救援。
思路:为电脑设置一些额外的观察系统,由他们去通知其他电脑。
观察者(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'); ?> |
途总结:观察者模式可以将某个状态的变化立即通知所有相关的对象,并调用对方的处理方法。
实现总结:需要一个观察者类来处理变化,被观察的对象需要实现通知所有观察者的方法