isset () создание свойства объекта

Сегодня я обнаружил проблему, когда тестировал свое приложение, и я не знаю, как это объяснить:

У меня простое условие:

if(isset($entity->filter)) {
    $var = "text";    
}

Возврат сервера

Объект {id: 0, name: "a", link: "a"}

ОК (ожидаемый объект возвращен)

Но когда я изменил свое состояние на это:

if(isset($entity->filter["where"])) {
    $var = "text";    
}

Возврат сервера

Объект {id: 0, имя: "a", ссылка: "a", фильтр: null}

ОШИБКА (объект установил свойство "фильтр")

Не могли бы вы объяснить мне, почему функция isset () во втором условии устанавливает свойство "filter" для моего объекта?

// РЕДАКТИРОВАТЬ

Я создаю тестовый PHP-код, который может воспроизвести указанную выше ошибку:

<?php

class testObj {

    public function __set($name, $value) {
        $this->$name = $value;
    }

    public function &__get($name) {
        return $this->$name;
    }

}

$obj = new testObj();

$obj->p1 = "test";
$obj->p2 = 10;
$obj->p3 = true;

var_dump($obj);

if(isset($obj->p4["arr"])) {
    // do something
}

var_dump($obj);

Выход

object (testObj) # 1 (3) {["p1"] => строка (4) "test" ["p2"] => int (10) ["p3"] => bool (true)} объект (testObj ) # 1 (4) {["p1"] => строка (4) "test" ["p2"] => int (10) ["p3"] => bool (true) ["p4"] => НУЛЕВОЙ }


person pes502    schedule 01.03.2016    source источник
comment
$ entity- ›фильтр это строка или массив?   -  person Naumov    schedule 01.03.2016
comment
Сейчас он не определен, но если он определен, это всегда массив   -  person pes502    schedule 01.03.2016
comment
попробуйте $entity->{filter["where"]}   -  person Gavin    schedule 01.03.2016
comment
if(isset($entity->{filter["where"]})) == ›неожиданно [..   -  person pes502    schedule 01.03.2016
comment
извините ... if(isset($entity->{$filter["where"]}))   -  person Gavin    schedule 01.03.2016
comment
print_r($entity); проверьте это   -  person devpro    schedule 01.03.2016


Ответы (1)


В первом условии isset () access $ entity проверяет, существует ли свойство. Во втором условии вы явным образом обращаетесь к свойству $ entity-> filter. Когда вы получаете доступ к свойству, которого не существует, свойство будет сгенерировано и инициализировано с помощью null. Затем вы можете использовать его или присвоить ему значение. Поскольку isset () обращается к свойству для проверки того, является ли это массивом с ключом «where», он генерирует свойство с нулевым значением. Это называется перегрузкой для динамического создания свойств: http://php.net/manual/en/language.oop5.overloading.php

person Candyman1332    schedule 01.03.2016
comment
спасибо, вы правы ... Не знаю, можно ли перегрузить функцию isset (). - person pes502; 01.03.2016
comment
Вы не перегружаете функцию isset (). isset () получает доступ к свойству, которого не существует, и механизм перегрузки генерирует свойство с нулевым значением. - person Candyman1332; 01.03.2016
comment
Извините, тогда я неправильно понял ваш комментарий. - person Candyman1332; 01.03.2016