Удалить элемент из объекта?

Есть ли простой способ удалить элемент из объекта? Не просто установите значение null, но и удалите его.

Спасибо!:)

Изменить: я уже пробовал unset(), и установка переменной-члена в null явно не работает. Я предполагаю, что я мог бы преобразовать объект в массив, а затем удалить соответствующий массив, и вернуться к объекту, но blech... Там должен быть более простой способ!

Ответы

Ответ 1

Вы используете RedBean. Просто проверил. И эти объекты bean не имеют реальных свойств.

unset($bean->field);

Не работает, поскольку ->field является виртуальным атрибутом. Он не существует в классе. Скорее, он находится в protected $bean->properties[], к которому вы не можете получить доступ. RedBean реализует только магические методы __get и __set для извлечения и установки атрибутов.

Вот почему unset() не работает. Он отключает свойство, которое никогда не существовало в этом месте.

Ответ 2

$obj = new stdClass;
$obj->answer = 42;
print_r($obj);
unset($obj->answer);
print_r($obj);

Прекрасно работает для меня. Вы уверены, что делаете это правильно?

Update:

Он также работает для свойств, определенных в классах:

class Foo {
    public $bar = 42;
}

$obj = new Foo;
print_r($obj);
unset($obj->bar);
print_r($obj);

Ответ 3

внутри объекта вы можете определить магический метод __unset

class Test
{
    public $data = array();

    public function __unset($key)
    {
        unset($this->data[$key]);
    }
}

И Джон хорошо подытожил другие факторы.

Ответ 4

RedBean имеет метод removeProperty на beans.

Ответ 5

Возможно unset().

Ответ 6

Нет, вы не можете, или в модуле Runkit, я вижу способ сделать это, даже если способы удалить методы/функции/константы существуют.

Ответ 7

С RedBean 4 вы можете использовать

unset($bean->someproperty);

Ответ 8

Вы хотите отключить свойство только потому, что не хотите, чтобы он хранился в базе данных?

Если это так, просто объявите свойство как private в классе.

Престижность этого ответа: Не сохранять свойство php-redbean в базу данных