php中Null 空 与0值区别分析

 更新时间:2016年11月25日 14:58  点击:1997
下面来给大家介绍一个可能大家都常用模糊的php中Null 空 与0值区别分析,下面举了几个例子,大家仔细的看看吧。


例子。

 代码如下 复制代码

<?php
$test=0;
if($test==''){
 echo '<br />在php中,0即为空'; //被输出
}
if($test===''){
 echo '<br />在php中,0即为空'; //不被输出
}
if($test==NULL){
 echo '<br />在php中,0即为空'; //被输出
}
if($test===NULL){
 echo '<br />在php中,0即为空'; //不被输出
}
if($test==false){
 echo '<br />在php中,0即为空'; //被输出
}
if($test===false){
 echo '<br />在php中,0即为空'; //不被输出
}
?>

从上面看得出来当为空时就与0或null是相等了,但如果是精确比较时我们会发现0与空或null是以字符对比了这样就不会了,如果是普通对比他就是逻辑假来对比了,从这里我们可以看出0==false,null=false,''==false哦。

 

今天在做一个小的采集发布接口时发现使用implode函数老提示出错,但在网上找了一下解决不了,后来仔细看一原因是写法错误了,当然因这个问题也学了不少东西下面给各位整理了一些更合理使用implode()函数用法。

我的程序

 代码如下 复制代码

echo $fileddata['house_feature'];
  
if($fileddata['house_feature']){
$fileddata['house_feature'] = implode('|||',$fileddata['house_feature']);
}

echo '----'.$fileddata['house_feature']

结果为:南北通透|||随时看房|||交通便利  --------

后来反复查没查出原因,百度搜索了一下有一个网友这样说implode(',',$goods_attr) 这个写的一点都不科学。应该做判断.if($goods_attr) 这一下想了,这个implode不是只能是把数组转换成字符吗?百度一下mplode() 函数把数组元素组合为一个字符串。

参数 描述
separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array 必需。要结合为字符串的数组。

后面没有值呀,后来

 代码如下 复制代码

$fileddata['house_feature'] = str_replace('|||',',',$fileddata['house_feature']);

再测试 南北通透|||随时看房|||交通便利南北通透,随时看房,交通便利  就是我想要的结果了。

php5中魔术方法有9个哦,下面我给大家整理了魔术方法9个的使用与简单的应用例子,如果你有兴趣不防进入参考吧,希望文章对各位同学会带来帮助哦。

1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。

 

 代码如下 复制代码
class Test { function __construct() { echo "before"; } } $t = new Test();
class Test { function __construct() { echo "before"; } } $t = new Test();

输出是:

start

构造器是一个魔术方法,当对象被实例化时它会被调用。在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承。如果我们想到以前继承例子从介绍到oop,我们能添加构造方法到Animal 类中
1

 代码如下 复制代码

class Animal{

  public function __construct() {

    $this->created = time();

    $this->logfile_handle = fopen('/tmp/log.txt', 'w');

  }

}

现在我们创建一个类来继承Animal类 - Penguin类!不添加任何属性和方法在Penguin类中,我们能申明并定义它继承自

 代码如下 复制代码

Animal类,如:
class Penguin extends Animal {
}

$tux = new Penguin;
echo $tux->created;

我们知道php5对象模型 和类名相同的函数是类的构造函数,那么如果我们同时定义构造函数和__construct()方法的话,php5会默认调用构造函数而不会调用__construct()函数,所以__construct()作为类的默认的构造函数
2.__destruct() 当删除一个对象或对象操作终止的时候,调用该方法。
Java代码

 代码如下 复制代码
class Test { function __destruct() { echo "end"; } } $t = new Test();将会输出end
class Test { function __destruct() { echo "end"; } } $t = new Test();将会输出end

我们就可以在对象操作结束的时候进行释放资源之类的操作

3.__get() 当试图读取一个并不存在的属性的时候被调用。

如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作。

 

 代码如下 复制代码
class Test { public function __get($key) { echo $key . " 不存在"; } } $t = new Test(); echo $t->name; 就会输出:name 不存在
class Test { public function __get($key) { echo $key . " 不存在"; } } $t = new Test(); echo $t->name; 就会输出:name 不存在

例子

 代码如下 复制代码

class Penguin extends Animal {

  public function __construct($id) {

    $this->getPenguinFromDb($id);

  }

  public function getPenguinFromDb($id) {

  }

}


4.__set() 当试图向一个并不存在的属性写入值的时候被调用。

 

 代码如下 复制代码

class Test { public function __set($key,$value) { echo '对'.$key . "附值".$value; } } $t = new Test(); $t->name = "aninggo"; 就会输出:对 name 附值 aninggo
class Test { public function __set($key,$value) { echo '对'.$key . "附值".$value; } } $t = new Test(); $t->name = "aninggo"; 就会输出:对 name 附值 aninggo

5.__call() 当试图调用一个对象并不存在的方法时,调用该方法。
 

 代码如下 复制代码


class Test { public function __call($Key, $Args) { echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true); } } $t = new Test(); $t->getName(aning,go);
class Test { public function __call($Key, $Args) { echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true); } } $t = new Test(); $t->getName(aning,go);
程序将会输出:


您要调用的 getName 方法不存在。参数是:Array
(
[0] => aning
[1] => go
)
您要调用的 getName 方法不存在。参数是:Array
(
[0] => aning
[1] => go
)

6.__toString() 当打印一个对象的时候被调用

这个方法类似于java的toString方法,当我们直接打印对象的时候回调用这个函数

 代码如下 复制代码


class Penguin {

 

  public function __construct($name) {

      $this->species = 'Penguin';

      $this->name = $name;

  }

 

  public function __toString() {

      return $this->name . " (" . $this->species . ")n";

  }

}

在适当的位置,输出该对象通过调用echo输出它,如:

 代码如下 复制代码

$tux = new Penguin('tux');

echo $tux;


7.__clone()

我们看过一个使用clone关键字的例子,在我的介绍从入门到oop的第二部分,创建对象的副本,而不是有两个变量指向同一个实际的数据。在一个类中重写此方法,我们可以观察发生了什么当在对象上使用clone关键字时,。虽然这是不是我们每一天能遇到的,一个漂亮的用例是创建一个真正的单例模式通过添加private访问修饰符给这个方法。

 代码如下 复制代码

class Test { public function __clone() { echo "我被复制了!"; } }$t = new Test(); $t1 = clone $t;程序输出:我被克隆了!


__sleep

__sleep()方法会被调用当对象被序列化后,并允许你处理序列化。这有各种各样的程序,一个很好的例子如果一个对象包含某种类型的指针,例如文件句柄或引用另一个对象。当对象被序列化然后解序列化,这些引用类型是无用的,因为这些类型的引用的目标可能不再存在或有效。因此,最好是来取消这些信息在存储它们之前。

__wakeup

__wakeup()是与__sleep()方法相反的,允许您更改对象解序列化的行为。和__sleep()一起使用,可以用来恢复被删除的句柄和对象当对象被序列化时。一个很好的例子程序是数据库句柄被取消设置当该项被序列化,然后恢复到当前配置中设置项目时,解序列化一个数据库句柄。


__autoload()方法可

比如我们将上面的那个Person类所在的文件定义为 Person_class.php ,
再新建一个php文件 test.php,编辑内容:

 代码如下 复制代码
function __autoload($calssName)
{
include $className.”_class.php”; //看到这也许你就明白了吧?哈哈
}
$p = new Person(“mifan”, 22);
$p->say();

这样执行该test.php页面就不会出现错误了。

php魔术方法一般在什么情况下需要使用


举个简单的例子,当类里面没有属性$name; 但是你不小心访问这个属性,这个时候就会出错。但是让你可以设置魔术方法__get($name){ return $name . "不存在"};就会自动调用__get($name);这样程序就会不因为你访问了一个不存在的属性报错而中断执行
补充下 __get($v) 访问未定义的属性时调用,
__set($v) ?未定义的属性赋值时调用,
__isset($v)对未定义的属性使用isset()函数时调用,
__unset($v)和isset($v)类似
__call($method)访问未定义的方法是被调用

 

我在php学习在使用到最多的数据合并方法就是array_merge、array_merge_recursive函数了,当然还会少用到操作符(+)函数了,下面我来给大家整理一下这几个函数的一些用法。

PHP中,有3种方法来进行数组合并:操作符(+)、array_merge、array_merge_recursive,其中前两种方式为一维数组的合并,第三种为递归合并。
在说PHP的数组合并之前,先要明白,PHP的数组分为索引数组和关联数组。索引数组是指没有键值和键值为数字的数组,关联数组是指键值为字符的数组。

下面说说操作符(+)和array_merge的区别:

1.当为索引数组时,合并相同键值的数组,操作符以最前面的值为合并后的结果,array_merge则是把相同键值的数组合并,并重新索引(不同键值的数组合并时,也会从0开始重新生成数字索引)。

1、“+”运算符
规则:
  当两个数组的键名是数字键名或者字符串键名
  $c = $a + $b
  在$a后追加($b在$a中不存在的键名)键名和值
注意:
  1、不覆盖,只是追加不存在的键名和对应的值
  2、键名不重新索引
  3、无论是全部数字键名还是混合,都只是追加键名和值,如果键名相同则不进行追加,即把最先出现的值作为最终结果返回
例1:数字键名

 代码如下 复制代码

$a = array(
    'a',
);
$b = array(
    'u',
);
$c = $a + $b;
var_dump($c);
 
output:
array(1) {
  [0]=>
  string(1) "a"
}
 例2:数字键名

$a = array(
    66=>'a',
);
$b = array(
    60=>'u',
    66=>'c'
);
$c = $a + $b;
var_dump($c);
 
output:
array(2) {
  [66]=>
  string(1) "a"
  [60]=>
  string(1) "u"
}
例3:字符键名

<?php 
$a = array(
    1=>'a',
    2=>'b',
    'c'=>'c',
    'd'=>'d',
);
$b = array(
    1=>'u',
    3=>'v',
    'c'=>'w',
    'd'=>'x',
    'y'=>'y',
    60=>'z',
);
$c = $a + $b;
var_dump($c);
?>
 
output:
array(7) {
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "b"
  ["c"]=>
  string(1) "c"
  ["d"]=>
  string(1) "d"
  [3]=>
  string(1) "v"
  ["y"]=>
  string(1) "y"
  [60]=>
  string(1) "z"
}

 

2.当为关联数组时,合并相同字符键值的数组,操作符合并规则是前面的覆盖后面的,array_merge则是后面的覆盖前面的。

例:

 代码如下 复制代码

$arr5 = array('a'=>'aaaa');
$arr6 = array('a'=>'bbbb');

var_dump($arr5+$arr6);
var_dump(array_merge($arr5,$arr6));
输出:
array (size=1)
  'a' => string 'aaaa' (length=4)
array (size=1)
  'a' => string 'bbbb' (length=4)


array_merge() 将一个或多个PHP数组合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

3.array_merge_recursive的合并规则和array_merge相同,只是array_merge_recursive支持多维数组的合并。

例:

 代码如下 复制代码

$a = array(

1=>'a',
2=>'b',
'c'=>'c',
'd'=>'d',

);

$b = array(
1=>'u',
3=>'v',
'c'=>'w',
'd'=>'x',
'y'=>'y',
60=>'z',

);

var_dump(array_merge_recursive($a,$b));

输出:

array (size=8)
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  'c' =>
    array (size=2)
      0 => string 'c' (length=1)
      1 => string 'w' (length=1)
  'd' =>
    array (size=2)
      0 => string 'd' (length=1)
      1 => string 'x' (length=1)
  2 => string 'u' (length=1)
  3 => string 'v' (length=1)
  'y' => string 'y' (length=1)
  4 => string 'z' (length=1)

下面来给大家分享一篇关于PHP开关语句Switch case学习笔记,如果你也正在学习php可以进入参考一下这篇文章,可能会给你带很大的帮助哦。

PHP 中的 Switch 语句用于执行基于多个不同条件的不同动作。如果你希望有选择地执行若干代码块之一,请使用 Switch 语句。

switch语法

 代码如下 复制代码

switch (expression)  //设置表达式
{
case label1: //比较标签1的值
 code to be executed if expression = label1; //如果匹配输出关联的代码
 break; //结束代码跳出语句
case label2: //比较标签1的值
 code to be executed if expression = label2;
 break;
default: //如果没有匹配,执行默认代码
 code to be executed
 if expression is different
 from both label1 and label2;
}

工作原理:

对表达式(通常是变量)进行一次计算
把表达式的值与结构中 case 的值进行比较
如果存在匹配,则执行与 case 关联的代码
代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
如果没有 case 为真,则使用 default 语句

 代码如下 复制代码

<?php
$x = 1; //变量x赋值为4
switch ($x)
{
 case 1: //要比较的值为1
  echo "数字 1";
  break;
 case 2: //要比较的值为2
  echo "数字 2";
  break;
 case 3: //要比较的值为3
  echo "数字 3";
  break;
 default: //没有符合的匹配时,输出默认值
  echo "没有1到3的数字";
}
?>

学习经验, swicth case只是一个开关语句,如果有多条件或多种情况我们就不可以使用它了,这时我们需要使用if else来操作了。

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • 校验非空的注解@NotNull如何取得自定义的message

    这篇文章主要介绍了校验非空的注解@NotNull如何取得自定义的message,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-29
  • lua读取redis数据的null判断示例代码

    最近在工作中遇到了一个问题,通过查找相关资料才得知原因是因为返回结果的问题,下面这篇文章主要给大家介绍了关于lua读取redis数据的null判断的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2020-06-30
  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • mysql IS NULL使用索引案例讲解

    这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
  • Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
  • python 爬取京东指定商品评论并进行情感分析

    本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • uniapp和vue的区别详解

    这篇文章主要介绍了uniapp和vue的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19
  • list与push的区别

    //函数list while(list($id,$username,$password,$add_date,$mdn,$mobile,$channel,$last_date,$area,$nickname) = mysql_fetch_array($rs)){ ...2016-11-25
  • Google会不会取消PR的理由分析

    Google是这样介绍PageRank的:   Google 出类拔萃的地方在于专注开发“完美的搜索引擎”,联合创始人拉里&middot;佩奇将这种搜索引擎定义为可“确解用户...2017-07-06
  • input框中的name和id的区别

    这篇文章主要介绍了input框中的name和id的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-11-22
  • Fatal error: Cannot redeclare class 原因分析与解决办法

    我使用的都是php __autoload状态自动加载类的,今天好好的程序不知道怎么在运行时提示Fatal error: Cannot redeclare class 了,看是重复定义了类,下面我来分析一下解决办...2016-11-25
  • 解决SpringBoot返回结果如果为null或空值不显示处理问题

    这篇文章主要介绍了解决SpringBoot返回结果如果为null或空值不显示处理问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-28
  • C#6 null 条件运算符

    本文主要对比C# 6 null运算符与老版本的不同,并且用代码实例测试,发现新语法性能提高,语法简化了。希望看到的同学对你有所帮助...2020-06-25