PHPのempty()関数がCakePHP 2の$ this-> dataで期待どおりに動作しないのはなぜですか?

混乱を緩和するため、この質問を完全に書き直しました。


ここにコントローラがあります:

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

全体ビューは次のとおりです:


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 ) ?>

レンダリングされた出力は次のとおりです。

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のバグ? ???

If I use another variable instead of $this->data :

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

とビュー:


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

それは期待どおりに動作します:

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

何かお手数ですか?

2
@ScottHarwell上記のエコー/デバッグがビューにあります。この質問の目的のためにテストされたデバッグコードは、上記のものとまったく同じです - 間に何かを書き直す機会はありません - の後に$ this-> data を反復するforeachループ> empty()テストでは、配列のすべての要素を表示できます。 PHP 5.3.6。
追加された 著者 Farray,
@ScottHarwell上記のエコー/デバッグがビューにあります。この質問の目的のためにテストされたデバッグコードは、上記のものとまったく同じです - 間に何かを書き直す機会はありません - の後に$ this-> data を反復するforeachループ> empty()テストでは、配列のすべての要素を表示できます。 PHP 5.3.6。
追加された 著者 Farray,
@ScottHarwell別の変数名の使用についての良い点。別の変数名にデータを代入すると、症状は訂正されますが、他の関数はうまく動作するのに対し、 empty は$ this-> dataで動作しません。
追加された 著者 Farray,
@ScottHarwell完全なコントローラとビューを含めるように質問を更新しました。私はそれを回避することができますが、なぜ起こっているのか不思議です。
追加された 著者 Farray,
$ this-> data配列(コントローラまたはモデル)をどこでエコー/デバッグしていますか?コントローラーの場合は?あなたのコードはこの例のように正確に見えますか?あなたのカウントをエコーし​​て空白をテストする間に$ this-> dataが上書きされる場所はありませんか? PHP 5.3以降を使用していますか?
追加された 著者 Scott Harwell,
なぜこれが起こっているのか分かりませんが、おそらく$ this->データをあなたのビューに割り当てるべきではありません。むしろ、新しい変数にあなたの検索結果のデータを割り当てて、そのようにしてください。 $ data = $ this-> Model-> findById(1)と同様です。
追加された 著者 Scott Harwell,
ビューは$ this->データを使用している可能性があり、おそらく変数を再割り当てしていると思います。しかし、私は全体の機能を見ることなく確認することはできません。
追加された 著者 Scott Harwell,
以下の@ JohnWatsonの答えは、あなたのコントローラの$ this-> dataにデータを割り当てない理由を説明しています。
追加された 著者 Scott Harwell,
あなたは "$ this-> request-> data"を試しましたか?
追加された 著者 dccarmo,

2 答え

$this->data is special in Cake views. When you access $this->data in a view, you actually end up calling the magic method View::__get(), and empty() doesn't work with methods or functions--it only works with variables. As you've found, the correct way to pass data to a view is by using $this->set() in your controller. Just to clarify, $this in the view is a different object than $this in your controller.

3
追加された
はい、知っています。彼は$ this->データをコントローラに設定しますが、ビューの$ this-> dataにアクセスしています。そしてそれらは異なる変数です。 Viewの$ thisはViewのインスタンスであり、$ thisはコントローラのインスタンスです。そして、はい、私はあなたが$ this->データを使用しないように注意します。なぜなら、この場合のようにオブジェクトによって内部的に使用されることが多いからです。
追加された 著者 John Watson,
私は彼が彼のコントローラーに$ this-> dataを設定していたと思う。私はAppControllerコードを見て、なぜそれが起こっているのかを正確に見る時間がありませんでした。しかし、あなたはベストプラクティスとは、モデルの外に$ this-> dataを設定するのを避けることだと同意しますか?
追加された 著者 Scott Harwell,

It could be that $this->data is inaccessible? (odd since you're in the class itself), in which case:

アクセスできないオブジェクトプロパティでempty()を使用する場合、__issetオーバーロードメソッド宣言されている場合は呼び出されます。

Either way, I would add a function to the class, something like $this->hasData() and use that instead. Have hasData return whether $this->data has elements.

0
追加された
この問題に対処するための質問が更新されました。この質問に関連するテスト目的のために、 count($ this-> data)とすぐに empty($ this-> data)count >は空を返している間に "2"を返しています。 $ this-> dataにアクセスできない場合は、 count も機能しません。
追加された 著者 Farray,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com