2012-02-03 834 views
15

Ejemplo:Cómo evitar propiedades dinámicas en PHP (elevar un error al establecer una propiedad no declarada)

error_reporting(E_ALL | E_STRICT); 
class Test {} 
$obj = new Test(); 
$obj->undeclared = "oops"; // I want an error here !! :(
echo $obj->algo;    // oops 

he comprobado en PHP 5.2.11 y 5.3.0.

No quiero propiedades dinámicas en mis objetos.
¿Es posible obligar a PHP a generar un ERROR en esa situación?

+0

¿Cómo '$ obj-> undeclared' le está causando problemas? –

+0

clase Prueba {public $ myVar; } $ obj-> my_var = TRUE;/* typo */if ($ obj-> myVar) {/ * oh oh! * /} – Enrique

+0

Necesita un buen IDE para evitar errores como este. –

Respuesta

13

Uso __set()?

<?php 
class Test { 

    public $bar; 

    public function __set($name, $value) { 
     throw new Exception('Cant set!'); 
    } 
} 

$obj = new Test; 
$obj->bar = 'foo'; 
$obj->foo = 'evil'; 
?> 
+3

Sí, eso funcionará, pero luego tengo que cambiar todas mis clases para agregar esa función, eso no es bueno. Esto debe hacerse de forma nativa por PHP. – Enrique

+0

Buen truco !!!!! Comprueba que "hereda normalmente", así que lo usaré en mis clases base !! :) –

0

Por "No quiero propiedades dinámicas en mis objetos". ¿Supongo que quiere decir que no quiere que las variables de su objeto estén indefinidas? Si este es el caso, solo crea una instancia de todas tus variables de clase. Incluso puedes hacer que sean estáticos si realmente te preocupa que sean constantes y no dinámicos de ninguna manera.

Si intenta acceder a una variable de objeto que no existe, PHP dará arrojará un error. La respuesta que los radmen sugirieron sería que, en lugar de arrojar un error, PHP creara dinámicamente variables de objeto indefinidas sobre la marcha.

+0

No. Quiero un error/aviso/advertencia cuando intento establecer una propiedad que no está declarada en mi clase (es decir, no quiero propiedades dinámicas en mis objetos, si no está declarada en mi clase entonces no debería existir, nunca). Si quiero eso, entonces usaré __set y __get. – Enrique

+0

Bueno, PHP hace exactamente lo que estás buscando. Sin embargo, es posible que necesite agregar E_WARNING a su informe de errores para que se muestre. –

+1

no, no es así, y si lee mi ejemplo verá que estoy agregando E_ALL que incluye E_WARNING (y también estoy agregando E_STRICT porque es el único que no está incluido en E_ALL, al menos anterior 5.4) – Enrique

Cuestiones relacionadas