PHP判断变量是否已存在

 更新时间:2016年11月25日 17:17  点击:1640
判断变量是否存在可以使用isset函数这个函数我们在许多cms开发中会有看到了,下面我们来看一下如何在php中检查变量是否已经存在了哦。


PHP函数:empty() 和 isset() 都是判断变量是否已配置的函数,不过使用的时候还是存在一定的区别。

empty() 函数用来测试变量是否已经配置。若变量已存在、非空字符串或者非零,则返回 false 值;反之返回 true。

isset() 函数用来测试变量是否已经配置。若变量已存在则返回 true 值。其它情形返回 false 值。

从上面两个函数的定义可以看出 empty() 和 isset() 的共同点是:都可以判定一个变量是否为空,都返回boolean类型,即true或false。而它们最明显区别的地方就是:返回的布尔值刚好是相反。

另外,他们之间最大的区别就是对于0的判断,若用empty判断会认为是空,用isset则认为不为空,举个例子:


<?php

          var $a=0;

           //empty($a)返回true

           if(empty($a)){

                 echo "判断结果是空"

           }

          //isset($a)返回true

           if(isset($a)){

                 echo "判断结果不是空"

           }
 ?>

empty() 判断一个变量是否为“空”,同时还会检测变量是否为空、为零。当一个变量值为0,empty() 认为这个变量同等于空,即相当于没有设置。而isset() 判断一个变量是否已经设置,就算变量值为空,为零也算已设置。

一、举例说明

A.如何判断一个变量是否定义?

<?php
// 假设不存在$test 变量
 
$isset = isset($test) ? "test is define!" : "test is undefine!";
echo "isset:$isset", '<br />';

$empty = !empty($test) ? "test is define!" : "test is undefine!";
echo "empty:$empty", '<br />';
 
$is_null = is_null($test) ? "test is define!" : "test is undefine!";
echo "is_null:$is_null";
测试结果是:

isset:test is undefine!
empty:test is undefine!
is_null:test is define!
结果表明: empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

B、看下各自接收的参数是什么?

isset函数参数:

<?php
$test=100;
echo isset($test),isset(100),$isset($b=100);
输出:

<br />
<b>Parse error</b>:  parse error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in <b>PHPDocument3</b> on line <b>3</b><br />
empty函数参数:

<?php
$test=100;
echo empty($test),empty(100),empty($b=100);
输出:

<br />
<b>Parse error</b>:  parse error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in <b>PHPDocument3</b> on line <b>3</b><br />
is_null函数参数:

<?php
$test=100;
echo is_null($test),is_null(100),is_null($b=100);
运行结果:没有任何错误。

结果表明: empty,isset输入参数必须是一个变量(PHP变量是以$字符开头的),而is_null输入参数只要是能够有返回值就可以(常量,变量,表达式等)。在PHP手册里面,对于他们解析是:empty,isset 是一个语言结构而非函数,因此它无法被变量函数调用。

二、概括总结isset,empty,is_null区别:

empty()

如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var、未定义,以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

isset()

如果 变量 存在且值非NULL,则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。

is_null()

检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是 null ,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】。

 


1、isset()对PHP参数判断

您可以使用 PHP isset() 来判断一个参数是否被定义,注意如果该参数为空,或者"\n"(NULL字节)使用 PHP isset() 判断之后,都会为TRUE。

<?php
$var = ''; // 这里初始参数$var='';
$var0 = FALSE // 这里初始参数为布尔FALSE
$var2 = NULL;  // 这里定义$var2=NULL,用isset()判断返回FALSE
$var3 = "\0"; // 这里是NULL字节,用isset()判断,返回TRUE,不同于NULL常数
$var4 = "www.qianyunlai.com"; // 这里定义会在下面给unset掉

if (isset($var)) {
  echo '参数$var已经设定,且值不为NULL';
}
// 参数$var已经赋值,而且值为$var='',所以会输出“参数$var已经设定”


if (isset($var0)) {
  echo '参数$var0已经设定,且值不为NULL';
}
// 参数$var0已经赋值,而且值为$var=FALSE,所以会输出“参数$var已经设定”


if (isset($vget)) {
  echo '参数$vget已经设定,且值不为NULL';
}
// 参数$vget根本就没有被提及过,isset($vget)返回FALSE,不会输出


if (isset($var2)) {
  echo '参数$var2已经设定,且值不为NULL';
}
// 这里是$var2虽然被设定了,但是$var2=NULL,所以isset($var2)返回FALSE,不会输出


if (isset($var3)) {
  echo '参数$var3已经设定,且值不为NULL';
}
// 参数$var3 虽然\0 就是代表NULL字节,但是这个不是常数NULL,所以$isset("\0")返回TRUE,会输出


unset($var4); // 这里给$var4 释放掉了
if (isset($var4)) {
  echo '参数$var4已经设定,且值不为NULL';
}
// 虽然开始已经定义$var4,而且还不为NULL,但是后来又给 unset() 掉了,所以不会输出。
?>
2、PHP isset() 对数组的判断

在使用PHP数组的时候,需要判断数组的某个值是否存在也可以使用 PHP isset() 函数。

<?php
$V => array(
  'aa' => 'www.qianyunlai.com',
  'bb' => array(
    'file' => 'file.qianyunlai.com',
    'img' => 'img.qianyunlai.com',
    'hosts' => array(
      'blog' => 'blog.qianyunlai.com',
      'res' => 'res.qianyunlai.com'
    )
  )
);

// var_dump用于输出TRUE 或 FALSE

var_dump(isset($V['aa']));
// 数组$V 的$V['aa'] ='www.qianyunlai.com'已经存在,所以输出TRUE

var_dump(isset($V['bb']['file']));
//$V['bb']['file'] = 'file.qianyunlai.com' 所以输出 TRUE

var_dump(isset($V['bb']['hosts']['blog']));
// $V['bb']['hosts']['blog']='blog.qianyunlai.com'所以输出TRUE

var_dump(isset($V['bb']['hosts']['sh']));
//根据数组,根本就没有设定该项,所以输出FALSE
?>
3、PHP isset()对参数判断

很多时候我们需要对多个参数进行判断,可以使用isset($A)&&isset($B)……来判断这些参数是不是都已经设定了,而且都不为NULL,对此您可以使用isset()多参数来判断是不是都设定了。

<?php
isset($v1)&&isset($v2)&&isset($v3)……
// 等价于
isset($v1,$v2,$v3……)
?>
使用isset()判断多个参数,需要所有参数都被设定,且不为NULL,只要其中有一个参数没有被设定过,或者为NULL,那么整个isset()就为FALSE。

4、PHP isset()判断$_POST、$_GET、$_REQUEST等值

用isset() 或者empty() 判断通过表单传递来的参数是isset() 最常见的用法。

if (isset($_POST['from']) && 'qianyunlai.com' == $_POST['from']) {
  echo '网站通过POST传递的来源是qianyunlai.com';
}
根据上面我们可以用isset判断多参数,在对表单传递来的值进行判断就最方便了。

<?php
// 表单传递来user用户名和 pass必须同时存在才能执行
if (isset($_POST['user'], $_POST['pass'])) {
  $user=$_POST['user'];
  $pass=$_POST['pass'];
  echo '您填写的用户名是:',$user,';密码是:',$pass;

}
?>
5、PHP isset($var{字符串长度}) 判断字符串长度

用PHP判断字符串是否存在或者判断字符串长度是否超过某一数字或者判断字符串长度是否为空一般使用strlen(),但是其实使用isset()性能更优越。

<?php
// 三元,等同于 if (isset($_POST['from'])) { $var = $_POST['from'];} else {$weiget = '';}

$var = isset($_POST['from']) ? $_POST['from'] : '';

// 判断$var存在,且字符串长度大于0
/* 菜鸟写法 
if (strlen($var) > 0) {
  echo '$var子符长度大于0';
}
*/

// 性能更优越的写法,判断$var第1个字符是否设定了
if (isset($var{1})) {
  echo '$var字符长度大于0';
}
?>
6、PHP isset() 与 PHP empty() 的区别

很多人都拿 PHP isset() 和 PHP empty()进行比较,不过得出的结论一般都是 PHP isset() 判断这个参数是否存在,且不为NULL,即使用 PHP isset() 判断空值、0、布尔值(TRUE/FALSE)都是TRUE,而且 PHP isset() 还可以对数组进行判断。

而 PHP empty(),若变量不存在,或者变量存在且其值为""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE。

那么!empty(),就是变量存在,且值不为""、0、"0"、NULL、FALSE、array()以及var $var;

<?php
// $_POST['from'] 传递来的是一个网址,据此我们可以知道,这个值一定不为0和布尔,只能是字符串,或者空字符串,或者不存在

/* 下面写法比较常见,但是需要判断两次
if (isset($_POST['from']) && isset($_POST['from']{1})) {
  echo '$weigeti子符长度大于0';
}
*/

// 下面用!empty() 只需要判断一次,更加高效
if (!empty($_POST['from'])) {
  echo '传递的from存在且不为空、0等';
}
?>
虽然有时候用!empty()判断传递来的$_GET、$_POST 性能更优越,但是并不是能完全代替isset()使用,如果传递的值允许包含0、'0'或者空的时候,就不能使用!empty()判断了,否则即使传递过来了0、'0'都会被当作没有传递任何值过来。

而对于可以确定传递过来的值一定不为0、'0'、空的时候,如用户名、密码等,使用!empty() 性能更优越。

 


补充:PHP 判断常量,变量和函数是否存在


if (defined('CONST_NAME')) {
    //do something
}

变量检测则是使用isset,注意变量未声明或声明时赋值为NULL,isset均返回FALSE,如:
 

if (isset($var_name)) {
    //do something
}

函数检测用function_exists,注意待检测的函数名也需要使用引号,如:


if (function_exists('fun_name')) {
 fun_name();
}
 

<?php
/* 判断常量是否存在*/
if (defined('MYCONSTANT')) {
echo MYCONSTANT;
}
//判断变量是否存在
if (isset($myvar)) {
echo "存在变量$myvar.";
}
//判断函数是否存在
if (function_exists('imap_open')) {
echo "存在函数imag_openn";
} else {
echo "函数imag_open不存在n";
}
?>
 
function_exists判断函数是否存在


<?php
if (function_exists('test_func')) {
    echo "函数test_func存在";
} else {
    echo "函数test_func不存在";
}
?>
 
filter_has_var函数
filter_has_var() 函数检查是否存在指定输入类型的变量。
若成功,则返回 true,否则返回 false。


<?php
if(!filter_has_var(INPUT_GET, "name"))
 {
 echo("Input type does not exist");
 }
else
 {
 echo("Input type exists");
 }
?> 

输出为. Input type exists

其他变量处理函数:
gettype:取得变量的类型。
intval:变量转成整数类型。
doubleval:变量转成倍浮点数类型。
empty:判断变量是否已配置。
is_array:判断变量类型是否为数组类型。
is_double:判断变量类型是否为倍浮点数类型。
is_float:判断变量类型是否为浮点数类型。
is_int:判断变量类型是否为整数类型。
is_integer:判断变量类型是否为长整数类型。
is_long:判断变量类型是否为长整数类型。
is_object:判断变量类型是否为类类型。
is_real:判断变量类型是否为实数类型。
is_string:判断变量类型是否为字符串类型。
isset:判断变量是否已配置。
settype:配置变量类型。
strval:将变量转成字符串类型。
unset:删除变量。

php数值计算有一些结果可能并不是我们想的那样但它这样计算有自己的理论基础了,下面我们来看一篇php 总结数值计算的注意事项吧。


一:四舍五入

1.round — 对浮点数进行四舍五入

float round ( float $val [, int $precision ] )

2:floor — 舍去法取整(向下取整)

float floor ( float $value )

3.ceil — 进一法取整(向上取整)

float ceil ( float $value )

坑点: 当数值为整数的时候 例如 11 那么floor(11) = 10  , ceil (11) =  12; 问题显而易见,所以计算的时候要格外注意这一点,解决方法  floor(11 + 0.01);

二:整数和小数相乘除

坑点:3.5 * 100 = 300 ,就算你数学再好也没用,在php世界里这就是真理。

解决方法就是将整型变成浮点型 3.5 * (float)100 = 350

三:浮点数的怪异

坑点:8.50 – 8 = 0.500000001  其实原因和2差不多,   解决方法:将结果进行round(),提高精度即可

身份证号码中的校验码是身份证号码的最后一位,是根据中华人民共和国国家标准GB 11643-1999中有关公民身份号码的规定,根据精密的计算公式计算出来的,我们下面来看利用PHP计算身份证校验码示例,具体的细节如下介绍。

中国(大陆)公民身份证号码每一位所代表的意义,网上很多文章都有介绍,在此就不多说。其中身份证号码的最后一位是校验码,跟据前17位计算得到。算法大 概是这样:把前17位的每一个数字和一串加权因子相乘,再计算这些乘积的和;把这些乘积的和模11得到的数字作为序号,最后在一个校验码串中提取出与序号 相对应的字符。当然,网上也有不少的文章教大家计算这个校验码,下面我们将尝试用PHP语言来完成这一工作,也许可以用于PHP开发中,如校验用户的身份 证号码是否正确。

假设某中国(大陆)公民的身份证号码前17位是这个:44010221990101001(注:此人出生于2199年),那么我们跟据上面的算法尝试写几行PHP代码来完成校验码的计算。为了能让大家更容易理解,我使用了较简单的语句,请看代码:

 代码如下 复制代码

<?php

//身份证号码前17位,可以从各种数据源中获得(如数据库、用户提交的表单等)

$body  = '44010221990101001';

//加权因子

$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

//校验码串

$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

//按顺序循环处理前17位

for ($i = 0;$i < 17;$i++) {

//提取前17位的其中一位,并将变量类型转为实数

$b = (int) $body{$i};

//提取相应的加权因子

$w = $wi[$i];

//把从身份证号码中提取的一位数字和加权因子相乘,并累加

$sigma += $b * $w;

}

//计算序号

$number = $sigma % 11;

//按照序号从校验码串中提取相应的字符。

$check_number = $ai[$number];

//输出

echo $body.$check_number;

?>

运行以上代码之后,可以算出该身份证的校验码为9。大家可以用自己身份证的前17位试试。

如果你明白上面的例子的话,就可以把这段代码的一些语句合并,去除没必要的变量,优化得到如下代码:

 代码如下 复制代码

<?php

$body  = '44010221990101001';

$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

for ($i = 0;$i < 17;$i++) {

$sigma += ((int) $body{$i}) * $wi[$i];

}

echo $body.$ai[($sigma % 11)];

?>

短链接我们可以自己生成当然也可以调用第三方的如我们调用新浪微博短链接api接口即可生成自己要的地址了,下面来看一些小编总结的例子。

新浪短网址接口的稳定性和跳转速度还是很给力的,现给出其API说明。
该接口支持两种返回格式:xml和json

对应的URL请求地址为:

 代码如下 复制代码

xml:http://api.t.sina.com.cn/short_url/shorten.xml
json:http://api.t.sina.com.cn/short_url/shorten.json

使用说明

请求方式:GET
请求参数:
source:应用的appkey
url_long:需要转换的长链接
举个例子:

 代码如下 复制代码

xml:http://api.t.sina.com.cn/short_url/shorten.xml?source=123456789&url_long==https://www.111cn.net

返回内容为:

<urls>
     <url>
          <url_short>http://t.cn/123456789</url_short>
          <url_long>=https://www.111cn.net</url_long>
          <type>0</type>
     </url>
</urls>

json:http://api.t.sina.com.cn/short_url/shorten.json?source=123456789&url_long=https://www.111cn.net

返回内容为:

[{"url_short":"http://t.cn/123456789","url_long":https://www.111cn.net","type":0}]

 代码如下 复制代码

<?php
session_start();
$allow_sep = '2';
if (isset($_SESSION['post_sep'])) {
    if (time() - $_SESSION['post_sep'] < $allow_sep) {
        die('请不要频繁刷新,休息2秒再刷新吧');
    } else {
        $_SESSION['post_sep'] = time();
    }
} else {
    $_SESSION['post_sep'] = time();
}
?>

php原始做法

 代码如下 复制代码

#短连接生成算法
  
    class Short_Url {
        #字符表
        public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

        public static function short($url) {
            $key = "alexis";
            $urlhash = md5($key . $url);
            $len = strlen($urlhash);

            #将加密后的串分成4段,每段4字节,对每段进行计算,一共可以生成四组短连接
            for ($i = 0; $i < 4; $i++) {
                $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4);
                #将分段的位与0x3fffffff做位与,0x3fffffff表示二进制数的30个1,即30位以后的加密串都归零
                $hex = hexdec($urlhash_piece) & 0x3fffffff; #此处需要用到hexdec()将16进制字符串转为10进制数值型,否则运算会不正常

                $short_url = "http://t.cn/";
                #生成6位短连接
                for ($j = 0; $j < 6; $j++) {
                    #将得到的值与0x0000003d,3d为61,即charset的坐标最大值
                    $short_url .= self::$charset[$hex & 0x0000003d];
                    #循环完以后将hex右移5位
                    $hex = $hex >> 5;
                }

                $short_url_list[] = $short_url;
            }

            return $short_url_list;
        }
    }

    $url = http://www.111cn.net;
    $short = Short_Url::short($url);
    print_r($short);

********************************

调用方法:

 代码如下 复制代码

    $short = Short_Url::short('www.baidu.com');
    var_dump($short);
    //省略链接memcache
    $memcache->set($cacheKey.$short[0],“原始地址”);

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 一个奇葩的最短的 IE 版本判断JS脚本

    使用 conditional comment 来判断 IE 的版本。嗯,是早早有人提出,但没有认真看代码。昨天刚好在看 CSS3 PIE 的时候看到,觉得是不是不靠谱。今天看到 Paul Irish 也提起,那么,推荐一下吧。这是作者博客上写的:复制代码 代码...2014-05-31
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • c# 判断是否为空然后赋值的4种实现方法

    下面小编就为大家分享一篇c# 判断是否为空然后赋值的4种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • MySql存储过程之逻辑判断和条件控制

    具体详情请看下文小编给大家带来的知识点。同编写程序类似,存储过程中也有对应的条件判断,功能类似于if、switch。在MySql里面对应的是IF和CASE1、IF判断IF判断的格式是这样的:IF expression THEN commands [ELSEIF ex...2015-10-21
  • PHP中empty和isset对于参数结构的判断及empty()和isset()的区别

    废话不多说了,直接给大家贴代码了。<&#63;php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = array(); //var $a8; $a9 = new test(); for ($i=1; $i <=9 ; $i++) {...2015-11-24
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • C#获得程序的根目录以及判断文件是否存在的实例讲解

    今天小编大家分享一篇C#获得程序的根目录以及判断文件是否存在的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 从PHP $_SERVER相关参数判断是否支持Rewrite模块

    如果是http://www.jb51.net/p1141.html形式的URL,可通过$_SERVER['REQUEST_URI']和$_SERVER['QUERY_STRING']值的区别来分析,最主要是如果页面是通过重定向会产生$_SERVER['REDIRECT_QUERY_STRING']和$_SERVER['REDIREC...2013-10-04
  • JavaScript判断DIV内容是否为空的方法

    整体思路是这样的:判断div内部是否为空,如果为空,给出无数据提示;否则显示正常页面,下面给大家分享js判断div内容是否为空的方法,对判断div内容是否为空的相关知识感兴趣的朋友一起学习吧...2016-02-01