首页 > 编程技术 > php

关于php函数isset和empty的一些误解

发布时间:2016-11-25 14:58

很多朋友在对php中的isset,empty是不区别的,昨天我看到一程序员也是这样做的,下面我就整理了一篇关于isset,empty一些误解


问题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以及URL

PHP:指示支持该函数的最早的 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
header(”Location: http://www.111cn.net”);
exit;
?>

例子

 代码如下 复制代码
<?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
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
?>

301

<?
Header( "HTTP/1.1 301 Moved Permanently" ) ;
Header( "Location: www.111cn.net" );
?>

 

星际里面的战斗都是在地图上进行的,只要我们可以编辑地图,就可以创造一些新的战役。可是,星际里面的地图绘制相关的代码如果开放出来,估计大多数万家都看不懂,更不要说自己编辑地图了。

待解决的问题:在不了解地图代码的结构下,我们要让玩家自己编辑地图。


思路:对于玩家而言,他熟悉的是水晶矿,高地这些形状,他和系统通过鼠标交互。我们可以设计一个地图编辑器让玩家使用,而无需让他研究绘制地图的细节代码。(实际上暴雪公司就是这样做的,很多玩家甚至暴雪内部人员都是用星际中的地图编辑器制作地图)


正面模式(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');

?>


途总结:观察者模式可以将某个状态的变化立即通知所有相关的对象,并调用对方的处理方法。


实现总结:需要一个观察者类来处理变化,被观察的对象需要实现通知所有观察者的方法

标签:[!--infotagslink--]

您可能感兴趣的文章: