Пустые PHP () на __ получают средство доступа

Используя 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)

Ожидание Набора № 1 для возврата того же как Набора № 2:

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

Это является действительно экранирующим и неинтуитивным. Свойства объектов производят непустые строки, но empty() полагает, что они пустые строки. Что продолжается здесь?

26
задан Charles 24 December 2012 в 00:02
поделиться

2 ответа

На основе чтения пустой ручной страницы и комментариев и комментариев Ctrl-F для ISSET и / или двойных подчеркиваний), похоже, что это известное поведение, и если вы хотите, чтобы ваш __ __ Set и __ Get Методы Пустые , чтобы играть приятно вместе, есть неявное предположение, которое вы реализуете __Set Magic Magic.

Это немного неприятное и запутанное, но это имеет тенденцию происходить с большинством мета-программирования, особенно в такой системе, как PHP.

34
ответ дан 28 November 2019 в 07:31
поделиться

В этом примере пустые () вызывает функцию перегрузки __set (), а не функцию перегрузки __get (). Попробуйте это:

class Test {

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

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

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

}
4
ответ дан 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: