Почему функция PHP empty () не работает должным образом с $ this-> data в CakePHP 2? - PullRequest
2 голосов
/ 13 ноября 2011

Чтобы устранить некоторую путаницу, я полностью переписал этот вопрос.


Вот контроллер:

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

Вот весь просмотр:

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

Вот обработанный вывод:

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

Почему empty() возвращает True, когда оба count() и debug() показывают, что было назначено непустое значение?

Это ошибка CakePHP?Ошибка в PHP????

Если я использую другую переменную вместо $ this-> data:

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

И представление:

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

это работает как ожидалось:

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

Любые берут?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011

$this->data особенное в видах торта.Когда вы получаете доступ к $this->data в представлении, вы фактически вызываете магический метод View::__get(), а empty() не работает с методами или функциями - он работает только с переменными.Как вы обнаружили, правильный способ передачи данных в представление - использование $this->set() в вашем контроллере.Просто чтобы уточнить, $this в представлении - это объект, отличный от $this в вашем контроллере.

0 голосов
/ 13 ноября 2011

Может быть, данные $ this-> недоступны? (странно, так как вы в самом классе), в этом случае:

При использовании empty () для недоступных свойств объекта будет вызван метод перегрузки __isset, если он объявлен.

В любом случае, я бы добавил функцию к классу, что-то вроде $ this-> hasData (), и использовал бы ее вместо этого. Have hasData возвращает, есть ли у $ this-> data элементы.

...