Удалить элемент из объекта?
Есть ли простой способ удалить элемент из объекта? Не просто установите значение 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 в базу данных