为什么php的empty()函数在CakePHP 2中不能像预期的那样处理$this->数据?


Why would PHP's empty() function not work as expected with $this->data in CakePHP 2?

为了避免混淆,我重新写了这个问题


这是控制器:

<?php
class StaffController extends AppController{
    function test(){
        $this->data = $this->Staff->find( 'list' );
    }
}

这是整个视图:

<pre>
Count: <?php echo count( $this->data ) . "'n"; ?>
Empty: <?php echo ( empty( $this->data ) ? 'true' : 'false' ) . "'n"; ?>
Count: <?php echo count( $this->data ) . "'n"; ?>
<?php var_dump( $this->data ) ?>
</pre>

下面是渲染后的输出:

Count: 2
Empty: true
Count: 2
array(2) {
  [1]=>
  string(12) "Mock Staff 1"
  [2]=>
  string(12) "Mock Staff 2"
}

count()debug()显示已分配非空值时,为什么empty()返回True ?

这是一个CakePHP错误吗?PHP bug????

如果我用另一个变量代替$this->data:

function test(){
    $this->set( 'data', $this->Staff->find( 'list' ) );
}

和view:

<pre>
Count: <?php echo count( $data ) . "'n"; ?>
Empty: <?php echo ( empty( $data ) ? 'true' : 'false' ) . "'n"; ?>
Count: <?php echo count( $data ) . "'n"; ?>
<?php var_dump( $data ) ?>
</pre>

按预期运行:

Count: 2
Empty: false
Count: 2
array(2) {
  [1]=>
  string(12) "Mock Staff 1"
  [2]=>
  string(12) "Mock Staff 2"
}

人吗?

$this->data在Cake视图中是特殊的。当您在视图中访问$this->data时,实际上最终调用的是魔术方法View::__get(),而empty()不能处理方法或函数——它只能处理变量。正如您所发现的,将数据传递给视图的正确方法是在控制器中使用$this->set()。为了澄清,视图中的$this与控制器中的$this是不同的对象。

这可能是$this->数据是不可访问的?(奇怪的,因为你在类本身),在这种情况下:

当对不可访问的对象属性使用empty()时,__isset重载方法将被调用,如果声明的话。

无论哪种方式,我都会向类添加一个函数,例如$this->hasData()并使用它。让hasData返回$this->data是否有元素