PHP: Cómo implementar un método __get similar para las variables locales de funciones

StackOverflow https://stackoverflow.com/questions/2669195

  •  28-09-2019
  •  | 
  •  

Pregunta

No soy ajeno a __get (), y lo han utilizado para hacer algunas bibliotecas muy conveniente en el pasado. Sin embargo, yo estoy frente a un nuevo desafío (PHP 5.3, abreviado y simplificado mi código para esta pregunta):

<?php
namespace test;

class View {
    function __construct($filename, $varArray) {
        $this->filename = $filename;
        $this->varArray = $varArray;
    }

    function display() {
        include($this->filename);
    }

    function __get($varName) {
        if (isset($this->varArray[$varName]))
            return $this->varArray[$varName];
        return "?? $varname ??";
    }
}

?>

El anterior es un sistema muy, muy simplificado para la carga de una vista. Este código llamaría a la vista y lo mostrará:

<?php

require_once("View.php");

use test\View;

$view = new View("views/myview.php", array("user" => "Tom"));
$view->display();

?>

Mi objetivo para este código es permitir a la vista "myview.php" que contiene el código siguiente:

<p>
    Hello <?php echo $user; ?>!  Your E-mail is <?php echo $email; ?>
</p>

Y, se utiliza con el código anterior, esto sería la salida "Hola Tom! Su correo electrónico es correo electrónico ?? ??"

Sin embargo, esto no va a funcionar. La vista está siendo incluido dentro de un método de clase, por lo que cuando se refiere a $ usuario y $ correo electrónico, que está en busca de las variables de función locales - no variables que pertenecen a la clase View. Por esta razón, nunca se __get disparado.

Me podría cambiar todas las variables de mi vista a cosas como $ this-> usuario y $ this-> correo electrónico, pero eso sería una solución desordenado y poco intuitivo. Me encantaría encontrar una manera donde puedo hacer referencia a variables directamente sin tener PHP lanzar un error cuando se utiliza una variable no definida.

Los pensamientos? ¿Hay una manera limpia de hacer esto, o estoy obligado a recurrir a soluciones hacky?

¿Fue útil?

Solución

EDICIÓN DE MI RESPUESTA . Un poco de un "vaguear", sino una solución potencial. Lo desea, puede "reiniciar" el gestor_errores a la funcionalidad más genérico.

view.php

<?php
error_reporting(E_ALL);
ini_set("display_errors", 0);
class View {
    function display($file, $values) {        
        set_error_handler(array($this, '__get'), E_NOTICE);        
        extract($values);
        include($file);
    }

    function __get($vaule)
    {
        echo '<i>Unknown</i>';
    }
}

$View = new View;
$values = array('user' => 'Tom',
               'email' => 'email@host.com');

$View->display('/filename.php', $values);
?>

filename.php

Hello <?php echo $user; ?>, your email is <?php echo $email; ?> and your are <?php echo $age; ?> years old.

salida

Hello Tom, your email is email@host.com and your are Desconocido years old.

Otros consejos

Se puede usar extracto de para tirar todas las variables en el ámbito local:

function display() {
    extract($this->varArray);
    include($this->filename);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top