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

 更新时间:2016年11月25日 14:58  点击:2247
很多朋友在对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--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25
  • PHP编码转换函数mb_convert_encoding与iconv用法

    文章来实现一个PHP编码转换函数mb_convert_encoding与iconv用法,希望例子能帮助到各位。 将一个短信接口代码从apache迁移到nginx+php-fpm后,发现无法发出短信了,查...2016-11-25
  • WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解

    这篇文章主要介绍了WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数,有助于读者更好的理解windows程序的消息机制,需要的朋友可以参考下...2020-04-25