美文网首页
记一次PHP函数empty引起的教训

记一次PHP函数empty引起的教训

作者: 封不然 | 来源:发表于2018-08-14 23:46 被阅读45次

事情是这样的,再写一个http客户端帮助类的时候,由于设置属性的时候,我使用了个 $attr 数组,并使用__set()与__get()魔术方法进行设置和获取,但是我在其他类中调用的时候,判断某个变量是否为空是使用了

if(empty($client->url)) $client->url = 'xxxxxxx';

结果每次都会去执行这句话,就这个现象,进行讨论。
以下是四种不同的情况

class HttpCli
{
    protected $attr = [];

    public function __set($name, $value)
    {
        $this->attr[$name] = $value;
    }

    public function __get($name)
    {
        return $this->attr[$name];
    }

}

$http_cli = new HttpCli();
$http_cli->url = 'https://www.baidu.com';
$http_cli->method = 'GET';

var_dump(isset($http_cli->url));
var_dump(empty($http_cli->url));
var_dump($http_cli->url);
var_dump($http_cli);
# 结果
bool(false)
bool(true)
string(21) "https://www.baidu.com"
object(app\index\controller\HttpCli)#34 (1) {
  ["attr":protected]=>
  array(2) {
    ["url"]=>
    string(21) "https://www.baidu.com"
    ["method"]=>
    string(3) "GET"
  }
}
class HttpCli1
{
    protected $attr = [];

    public function __set($name, $value)
    {
        $this->attr[$name] = $value;
    }

    public function __get($name)
    {
        return $this->attr[$name];
    }

    /**
     * 解决方案
     */
    public function __isset($name)
    {
        if(!isset($this->attr[$name])) return null;
        return false === empty($this->attr[$name]);
    }
}

$http_cli = new HttpCli1();
$http_cli->url = 'https://www.baidu.com';
$http_cli->method = 'GET';

var_dump(isset($http_cli->url));
var_dump(empty($http_cli->url));
var_dump($http_cli->url);
var_dump($http_cli);

bool(true)
bool(false)
string(21) "https://www.baidu.com"
object(app\index\controller\HttpCli1)#35 (1) {
  ["attr":protected]=>
  array(2) {
    ["url"]=>
    string(21) "https://www.baidu.com"
    ["method"]=>
    string(3) "GET"
  }
}
class HttpCli2
{
    protected $url = '';
    protected $method = '';

    public function __set($name, $value)
    {
        $this->$name = $value;
    }

    public function __get($name)
    {
        return $this->$name;
    }
}

$http_cli = new HttpCli2();
$http_cli->url = 'https://www.baidu.com';
$http_cli->method = 'GET';

var_dump(isset($http_cli->url));
var_dump(empty($http_cli->url));
var_dump($http_cli->url);
var_dump($http_cli);

bool(false)
bool(true)
string(21) "https://www.baidu.com"
object(app\index\controller\HttpCli2)#34 (2) {
  ["url":protected]=>
  string(21) "https://www.baidu.com"
  ["method":protected]=>
  string(3) "GET"
}
class HttpCli3
{
    public $url = '';
    public $method = '';
}

$http_cli = new HttpCli3();
$http_cli->url = 'https://www.baidu.com';
$http_cli->method = 'GET';

var_dump(isset($http_cli->url));
var_dump(empty($http_cli->url));
var_dump($http_cli->url);
var_dump($http_cli);

bool(true)
bool(false)
string(21) "https://www.baidu.com"
object(app\index\controller\HttpCli3)#35 (2) {
  ["url"]=>
  string(21) "https://www.baidu.com"
  ["method"]=>
  string(3) "GET"
}

从php语言的角度而言,在操作一个不可访问属性的时候,会使用到PHP的重载方法(属性重载只能在对象中进行)
1.在给不可访问属性赋值时,__set() 会被调用。
2.读取不可访问属性的值时,__get()会被调用。
3.当对不可访问属性调用 isset()或 empty()时,__isset()会被调用。
4.当对不可访问属性调用 unset()时,__unset()会被调用。

实际上相当于调用了不可见属性的时候使用,获取值是没问题的,只是当对属性isset()或 empty()时,会调用__isset(),那既然知道是这样的话,我们只需要像例2:类HttpCli1那样的去实现下__isset()即可

public function __isset($name)
{
    if(!isset($this->attr[$name])) return null;
    return false === empty($this->attr[$name]);
}

相关文章

  • 记一次PHP函数empty引起的教训

    事情是这样的,再写一个http客户端帮助类的时候,由于设置属性的时候,我使用了个 $attr 数组,并使用__se...

  • PHP的empty函数

    empty() empty()用于检测变量是否为空。例如:判断某个重要的值是否为空,以此为条件决定下一步要做什么。...

  • PHP之empty函数

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

  • PHP的empty函数问题

    最近学习ThinkPHP5,在看一个教程过程中有一段这样的代码 功能是用来检测用户登录状态并防止重复登录的,但是教...

  • PHP 奇怪的 empty() 函数

    php 的 empty() 的确是挺奇怪的一个函数, 以下列一下情况: 对于字符串是 '0' 的情况特别的特殊,所...

  • 由一些小问题引发的思考

    如何判断数组是否为空? c++实现 php实现 关于PHP的empty函数php-manual中这样解释:一下情况...

  • 测试变量的函数:empty、isset、is_null的区别

    PHP提供了三个用于测试变量值的函数,分别是:isset()、empty()、is_null(),这些函数的返回值...

  • 前端基础搬运工-PHP后台开发模块

    六、PHP后台开发模块 基础部分 1. php inset 和 empty 的区别? - [ ] 1、empty...

  • PHP 基础语法

    PHP基本语法 变量相关的函数 isset() 判断变量是否被定义 empty() 判断变量是否为空值, unse...

  • empty()函数

    其结果同取反 !

网友评论

      本文标题:记一次PHP函数empty引起的教训

      本文链接:https://www.haomeiwen.com/subject/vinvbftx.html