__get 访问器上的 PHP empty()

标签 php oop

使用 PHP 5.3 在将 empty() 应用于通过 __get() 重载函数获取的动态对象属性时,我遇到了奇怪/不直观的行为。考虑以下代码片段:

<?php

class Test {

  protected $_data= array(
   'id'=> 23,
   'name'=> 'my string'
  );

  function __get($k) {
    return $this->_data[$k];
  }

}

$test= new Test();
var_dump("Accessing directly:");
var_dump($test->name);
var_dump($test->id);
var_dump(empty($test->name));
var_dump(empty($test->id));

var_dump("Accessing after variable assignment:");
$name= $test->name;
$id= $test->id;
var_dump($name);
var_dump($id);
var_dump(empty($name));
var_dump(empty($id));

?>

这个函数的输出如下。比较 empty() 检查第一个和第二个结果集的结果:

设置 #1,意外结果:

string(19) "Accessing directly:"
string(9) "my string"
int(23)
bool(true)
bool(true)

期望 Set #1 返回与 Set #2 相同的结果:

string(36) "Accessing after variable assignment:"
string(9) "my string"
int(23)
bool(false)
bool(false)

这真是令人费解且不直观。对象属性输出非空字符串,但 empty() 认为它们是空字符串。这是怎么回事?

最佳答案

基于对 empty 的阅读的手册页和注释(Ctrl-F 用于 isset 和/或双下划线),看起来这是已知行为,如果你想要你的 __set__get 方法和 empty 一起玩得很好,有一个隐含的假设,即您也实现了一个 __isset 魔术方法。

这有点不直观和令人困惑,但大多数元编程往往会发生这种情况,尤其是在像 PHP 这样的系统中。

关于__get 访问器上的 PHP empty(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045791/

相关文章:

java - 允许类的属性是可选的(基本 OOP Java)

php - OOP 的一个逻辑错误

php - 将可嵌入字段设置为父实体映射的主键 - Doctrine2

Python 类派生自 pandas DataFrame,具有 list/DataFrame 属性

arrays - Matlab 对象数组的逻辑索引

php - 自定义 session 变量的 session 生命周期

c++ - 在哪里实例化依赖于主类的类?

php - 更新数据库中表行的快捷方式?

javascript - 使用代码 : Rendering a graph of connected nodes in JS or PHP 绘图

php - 从每种类型中选择 X 项