2011-03-19 23 views
13

¿Hay una manera simple de eliminar un miembro de un objeto? No solo configúrelo como nulo, sino que realmente elimínelo.Eliminar un miembro de un objeto?

Gracias! :)

Editar: Ya he intentado unset(), y establecer la variable miembro a nulo obviamente no funciona. Supongo que podría convertir el objeto en una matriz, luego eliminar la clave de la matriz en cuestión, y convertir de nuevo a un objeto, pero blech ... ¡Tiene que haber una manera más fácil!

+0

que estoy pensando es posible que desee ver en algunas de las posibilidades ofrecidas por la reflexión. No es 100% al respecto, pero las clases de Reflection brindan algunas características integrales. Además, curioso; *por qué*? – Dan

+0

¿Cómo se verifica si se eliminó? ¿Está establecido? var_dump? – NikiC

+0

Estoy usando RedBean en mi capa de persistencia; crea una columna para cada miembro en el Bean (un objeto).Hay una variable de miembro sobrante de una función de utilidad que utilizo; en lugar de reescribir la función de utilidad, preferiría simplemente eliminar la variable de miembro en cuestión. – rinogo

Respuesta

15

Usted está usando RedBean. Acabo de comprobarlo. Y estos objetos de frijoles no tienen propiedades reales.

unset($bean->field); 

no funciona, porque ->field es un atributo virtual. No existe en la clase. Más bien reside en el protected $bean->properties[] al cual no puedes acceder. RedBean solo implementa los métodos mágicos __get y __set para recuperar y establecer atributos.

Es por eso que el unset() no funciona. Desarma una propiedad que nunca existió en esa ubicación.

+2

Acabo de buscar en Google esto de nuevo, y mi respuesta surgió ... ¡Ja! :) Para cualquier otra persona que tenga este problema, puede intentar parchear su RedBean para permitir llamar a unset() en propiedades de bean. Inserte esto después del método mágico __set(): \t/* Magic Setter. Deshace el valor de una propiedad específica. */ \t public function __unset ($ property) { \t \t unset ($ this-> properties [$ property]); \t} – rinogo

+0

Página abajo para ver la respuesta correcta. – Colin

1

Posiblemente unset().

+0

Parece que no funciona. : P (Ya lo intenté :)) – rinogo

+1

@rinogo: ¿Cómo usaste unset? Por favor muestra. – mario

+0

¡Hola, Mario! Lo estoy usando para desarmar la variable miembro llamada 'old_index' de esta manera: "unset ($ c-> old_index);" – rinogo

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

Works fine for me. ¿Estás seguro de que lo estás haciendo bien?

Actualización:

It also works para las características definidas en las clases:

class Foo { 
    public $bar = 42; 
} 

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

Sí, eso también funciona bien para PHP 5.3.2. También trabajó en una clase definida real (incluida la eliminación de miembros definidos). – jesse

+0

¡Es tan extraño que no funciona para mí! Creo que estoy en PHP 5.1.2 si eso cambia algo ...: P – rinogo

+0

¿Es una propiedad dinámica, la "respuesta" de Jon, o una que está codificada en la definición de la clase? Esos son imposibles de eliminar. ¿Por qué necesitas quitarlo? –

4

en su interior el objeto que puede definir un método mágico llamado __unset

class Test 
{ 
    public $data = array(); 

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

y Jon resumió la otra factores muy bien.

3

RedBean tiene un método removeProperty en beans.

+0

¡Gracias por tu comentario! Esto debería ser útil para los recién llegados a esta pregunta. Creo que esto no estaba disponible en RedBean alrededor de principios de 2011 (ahora es casi exactamente tres años después :)). De hecho, en el día (como se puede ver en mi comentario del 17 de enero de 13), agregué un setter mágico para permitir que unset() se use directamente en el bean. – rinogo

0

¿Desea desarmar la propiedad simplemente porque no la quiere almacenar en la base de datos?

En caso afirmativo, solo declare la propiedad como private en la clase.

Felicitaciones a esta respuesta: Not saving property of a php-redbean to database

+0

TBH, hice esta pregunta hace casi cuatro años, así que no recuerdo. De todos modos, gracias por tu respuesta! Tal vez ayudará a alguien más! :) – rinogo

1

Con Redbean 4 se puede utilizar

unset($bean->someproperty); 
Cuestiones relacionadas