PHP: Come implementare un metodo __get-come per le variabili di funzione locali

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

  •  28-09-2019
  •  | 
  •  

Domanda

Sono estraneo a __get (), e lo hanno utilizzato per fare alcuni molto convenienti librerie in passato. Tuttavia, sono di fronte a una nuova sfida (PHP 5.3, abbreviato e semplificato il mio codice per questa domanda):

<?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 ??";
    }
}

?>

Sopra è un sistema molto, molto semplificata per il caricamento di una vista. Questo codice avrebbe chiamato la vista e visualizzarla:

<?php

require_once("View.php");

use test\View;

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

?>

Il mio obiettivo per questo codice è quello di permettere la vista "myview.php" per contenere il codice come questo:

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

E, utilizzato con il codice di cui sopra, questo sarebbe uscita "Ciao Tom! Il tuo indirizzo e-mail è ?? email ??"

Tuttavia, questo non funzionerà. La vista è incluso all'interno di un metodo di classe, in modo che quando si riferisce a $ user e $ e-mail, è alla ricerca di variabili della funzione locali - non variabili appartenenti alla classe View. Per questo motivo, __get non viene mai attivato.

ho potuto cambiare le variabili di tutta la mia vista a cose come $ this-> utente e $ this-> e-mail, ma che sarebbe un disordinato e la soluzione poco intuitivo. Mi piacerebbe trovare un modo in cui posso fare riferimento a variabili direttamente senza dover PHP genera un errore quando viene utilizzata una variabile non definita.

Pensieri? C'è un modo pulito per fare questo, o sono costretti a ricorrere a soluzioni hacky?

È stato utile?

Soluzione

Modifica MIO RISPOSTA . Abit di un "hack in giro", ma una potenziale soluzione. Può decidere di "Reset", l'error_handler alle funzionalità più generico.

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.

Output

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

Altri suggerimenti

È possibile utilizzare estratto di tirare tutte le variabili in ambito locale:

function display() {
    extract($this->varArray);
    include($this->filename);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top