【问题标题】:PHP/Magento: empty($object->property) returns true despite property is StringPHP/Magento:empty($object->property) 返回 true,尽管属性是字符串
【发布时间】:2014-10-06 10:01:25
【问题描述】:

我用 Magento 函数 setData 设置了一些值:

$this->getChild('childBlockName')->setData('search_field_value', $this->__('field value'));

在父 .phtml 文件中。

然后,在子 .phtml 文件中,我尝试获取值:

echo $this->search_field_value.'<br />';
$testvar = empty($this->search_field_value) ? 'empty value':'non empty value';
echo $testvar;

回声:

'field value'
'empty value'

和:

$testvar = $this->search_field_value;
$testvar2 = empty($testvar) ? 'empty value':'non empty value';
echo $testvar2;

回声:

'non empty value'

为什么对象的属性只有在分配给变量后才被识别为非空?

【问题讨论】:

    标签: php magento object properties


    【解决方案1】:

    这里是php函数的问题

    empty()
    

    该函数只接受参数。如果你有类似的功能:

    function getValue(){
        return "hallo";
    }
    

    然后尝试执行以下操作:

    echo empty(getValue());
    

    你会得到错误,但如果你尝试这样做:

    $val = getValue();
    echo empty($val);
    

    你会得到正确的答案而不会出错。这意味着函数 empty() 不包含函数返回值,只包含变量。

    希望对你有帮助。

    magento 的解释:

    是的,你是对的,你的代码工作正常,但在 magento 中与你的示例有点不同,因为 magento 实际上使用魔法函数和数组:

    当您在 magento 中设置虚拟变量时,它实际上成为数组的一部分,而不仅仅是像您的示例中那样的虚拟变量。如果你看一下magento函数

    public function setData($key, $value=null);
    

    有一行你在 _data 数组中添加你的值:

    $this->_data[$key] = $value;
    

    所以,当你做这样的事情时:

    $this->search_field_value
    

    您实际上是在调用魔术方法 __call,该函数在 _data 数组中搜索输入的值,在我们的例子中为 search_field_value。这就是 magento 返回空的原因。

    【讨论】:

    • 我同意,但我正在尝试检查 $this-&gt;search_field_value 这是一个对象的属性,而不是方法。
    • 对,但它不是“标准”对象属性,因为您使用方法 setData() 设置了它,并且该属性是虚拟的,而不是真实的。
    • 它不是硬编码的,它是动态的。我没有意识到在这种情况下会有所不同!我会做一些测试,然后用我的结果回复你。谢谢:)。
    • 我编写了一个简单的测试,并且在运行时在虚拟/动态属性集上运行的 empty() 返回 false。请查看此代码link。我不确定 Magent 是否使用相同的方式来创建新属性。
    • 感谢 Marko 的教育性回答。我已经用 __get() here 进行了测试,它按预期工作。 __get() 似乎是属性的神奇方法,而 __call() 是方法。不过我还没有检查过 Magento 的代码。
    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多