​PHP开发过程的那些坑(五) ——PHP的empty()

PHP开发过程的那些坑(五)——PHP的empty()

(原创内容,转载请注明来源,谢谢)

一、遇到的问题

PHP的empty不是一个函数,而是一个语言结构,用其可以判断大多数的变量是否为空。但是,在判断private的属性(已经用魔术方法__get()保证可以获取到)的时候,会发生奇怪的事情。

现象实例:

class Object{
private $prop;
public function __construct(){
$this->prop = ‘a’;
}
public function __get($prop){
return $this->$prop;
}
}
$obj = new Object();
var_dump($obj->prop);// a
var_dump(empty($obj->prop));//true,不正常现象
var_dump(‘’ == $obj->prop);//false

二、问题分析

经过查阅资料,采用empty判断对象的private的属性是否为空的时候,会调用的是对象对应的类的魔术方法__isset(),即判断这个属性是否存在,而不是去判断属性的值了。

这样就可以解释,为什么实际属性值非空,而empty判断是true。

三、解决方案

1、采用==判断是否为空。

2、$prop = $obj->prop; empty($prop);

3、将对象的private设置成public。

第三种得根据业务场景,不一定都可以用public;第二种和第一种比较通用,个人建议对于判断类的属性值的问题,都统一用第一种,这样可以避免很多不必要的坑。

——written by linhxx 2017.09.14

相关阅读:

PHP开发过程的那些坑(四) ——PDO bindParam函数

PHP开发过程的那些坑(三) ——PHParray_shift函数

PHP开发过程的那些坑(二) ——PHP empty函数

PHP开发过程的那些坑(一) ——对象拷贝

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-09-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT可乐

Redis详解(三)------ redis的五大数据类型详细用法

  我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提...

740
来自专栏运维技术迷

Redis全局命令

redis有5种数据结构,他们是键值对中的值,对于键来说有一些通用的命令。 查看所有键 语法:keys * [root@vultr ~]# redis-cli ...

3037
来自专栏破晓之歌

vuex入门,详细的讲解(小知识积累) 原

1.vuex入门,详细的讲解:https://segmentfault.com/a/1190000011716027

642
来自专栏李蔚蓬的专栏

关于try...except和try ....except...else

我们写程序的时候,有时会出现一些错误或异常,导致程序终止。例如,做除法时,除数为0,会引起一个ZeroDivisionErro:

835
来自专栏小樱的经验随笔

【批处理学习笔记】第二十三课:用户变量和变量引用

用户变量     编写批处理程序时,用户根据需要自己定义的变量称之为用户变量。用户变量类似于C语言里面的变量,仅仅在定义该变量的程序中有效。     用户变量由...

2694
来自专栏Rgc

json.loads()的字符串中为单引号引发的错误

Traceback (most recent call last): File "G:/FastWorkStateServer/logs/redis_fabu....

541
来自专栏电光石火

获取URL地址中的GET参数

/*-----------------实现1--------------------*/ function getPar(par){ //获取当前URL...

2019
来自专栏小樱的经验随笔

【批处理学习笔记】第十课:批处理符号(3)

七、 && 这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行 dir z:\ && dir y:\ && dir c:\ 八、"...

2705
来自专栏流媒体人生

linux eval

eval 就是执行以下两个步骤 1.第一次,执行变量替换,类似与C语言的宏替代

692
来自专栏从零开始学自动化测试

python笔记4-遍历文件夹目录os.walk()

前言 如何遍历查找出某个文件夹内所有的子文件呢?并且找出某个后缀的所有文件 一、walk功能简介 1.os.walk() 方法用于通过在目录树种游走输出在...

3455

扫码关注云+社区