2011-05-06 21 views
21

¿Cómo puedo dejar que la variable $foo que se encuentra debajo sepa que foo debe ser falso?PHP - La función del constructor no devuelve falso

class foo extends fooBase{ 

    private 
    $stuff; 

    function __construct($something = false){ 
    if(is_int($something)) $this->stuff = &getStuff($something); 
    else $this->stuff = $GLOBALS['something']; 

    if(!$this->stuff) return false; 
    } 

} 

$foo = new foo(435); // 435 does not exist 
if(!$foo) die(); // <-- doesn't work :(

Respuesta

32

No puede devolver un valor desde el constructor. Puedes usar exceptions para eso.

function __construct($something = false){ 
    if(is_int($something)) $this->stuff = &getStuff($something); 
    else $this->stuff = $GLOBALS['something']; 

    if (!$this->stuff) { 
     throw new Exception('Foo Not Found'); 
    } 
} 

Y en su código de instancias:

try { 
    $foo = new foo(435); 
} catch (Exception $e) { 
    // handle exception 
} 

También puede extender excepciones.

+0

quieres decir http://php.net/manual/en/language.exceptions.php? pero ¿no mostrará un error de php y detendrá el script? Solo quiero devolver el resultado falso ... – Alex

+0

No si lo "atrapa". Puedes hacer lo que quieras a partir de ese punto. – webbiedave

+0

Entonces lo estás haciendo mal. En su lugar, debe asignar cualquier variable que se le dé y luego invocar 'if ($ foo-> is_falid()) {/ * do stuff * /}', y dejar de abusar de la función 'die()'. –

4

Se supone que el constructor no devuelve nada.

Si necesita validar datos antes de usar el para crear un objeto, debe usar una clase de fábrica.

Editar: sí, las excepciones también harían el truco, pero no debería haber ninguna lógica dentro del constructor. Se convierte en un dolor para las pruebas unitarias.

+0

¿Qué es una clase de fábrica y cómo la uso? : D – Alex

+0

@Alex, mira [este video] (http://www.youtube.com/watch?v=4F72VULWFvc), esto podría explicar algo de eso (sí, el ejemplo está en Java, pero es una charla sobre teoría y no "cómo escribir hola mundo"). –

+0

gracias, voy a ver un poco más tarde: D – Alex

Cuestiones relacionadas