为了避免混淆,我重新写了这个问题
这是控制器:
<?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是否有元素