Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php empty()和magic方法_Php - Fatal编程技术网

Php empty()和magic方法

Php empty()和magic方法,php,Php,我的处境并不复杂,但我花了一段时间才弄明白 class A { private $data = array('key' => 'value'); public function __get($name){ return $this->data[$name]; } } $a = new A(); var_dump(empty($a->key)); // TRUE 我想这是因为empty出于某种原因检查类结构,而不是在括号内运行代码

我的处境并不复杂,但我花了一段时间才弄明白

class A {

    private $data = array('key' => 'value');

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

}

$a = new A();
var_dump(empty($a->key)); // TRUE
我想这是因为
empty
出于某种原因检查类结构,而不是在括号内运行代码。为什么它没有按预期评估此代码


这是一个bug还是它为什么不能正常工作?

首先,在PHP中,您需要使用
$this->
来访问类变量,比如
$data
(因此
$this->data
而不是
$data
)。使用另一种语言一段时间后很容易忘记,但如果您在开发代码时没有将错误报告设置为
E_ALL
,则应将其设置为该值。在开发过程中将其设置为
E_ALL
,可以让您更容易地发现(潜在)此类错误,并提高代码质量

为了解决实际问题,为了确定是否为magic变量设置了变量,您需要添加
\u isset
magic方法():


您不应该使用
返回$data[$name]
但是
返回$this->data[$name],我猜?@KIKOSoftware是的,我只是为了这个问题写了这个,简单的错误。将修复它,感谢关于
$this
的部分,很抱歉我只是为了这个问题写了这段代码,这是一个简单的错误,抱歉。谢谢在C#和PHP之间切换是我的一个常见错误如果你正在学习魔法方法,我建议你看一看;我真的很喜欢它的工作方式(虽然有点复杂)。但是,我想知道,如果这个方法这么简单,为什么它不能自动实现呢?我的意思是我只需要编写
函数uu-isset($name){return-isset($this->data[$name])}
。我想知道为什么他们没有将其配置为默认运行:?@php\u nub\u qq,因为get与isset非常不同。你不能简单地把isset和get电话联系起来,因为这是一个危险的假设。isset应该是一个非常简单的调用,用于检查它是否存在。get可能是一个繁重/昂贵的调用,它实际获取所有数据,处理数据,然后返回数据。
<?php

class A {

    private $data = array('key' => 'value');

    public function __get($name){
        return $this->data[$name];
    }
    public function __isset($name){
        return array_key_exists($name, $this->data);
    }

}

$a = new A();
var_dump(empty($a->key)); // it's FALSE now