PHP: Wie ein __get artiges Verfahren für die lokalen Funktionsvariablen implementieren

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

  •  28-09-2019
  •  | 
  •  

Frage

Ich bin kein Fremder () __get, und habe es einige sehr bequeme Bibliotheken in der Vergangenheit zu machen. Allerdings bin ich mit einer neuen Herausforderung (PHP 5.3, kurz und vereinfacht meinen Code für diese Frage) konfrontiert:

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

?>

Oben ist ein sehr, sehr vereinfachtes System für eine Ansicht zu laden. Dieser Code würde die Ansicht aufrufen und zeigt es:

<?php

require_once("View.php");

use test\View;

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

?>

Mein Ziel für diesen Code ist die Ansicht „myview.php“ zu erlauben, Code wie folgt zu enthalten:

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

Und mit dem obigen Code verwendet wird, würde dies Ausgang "Hallo Tom! Ihre E-Mail ist ?? E-Mail ??"

Allerdings wird dies nicht funktionieren. Die Ansicht wird innerhalb einer Klasse-Methode einbezogen, so, wenn es um $ user und $ E-Mail bezieht, es ist für die lokale Funktionsvariablen suchen - nicht Variablen in die View-Klasse gehören. Aus diesem Grunde wird __get nie ausgelöst.

konnte ich alle Variablen, die Dinge meiner Ansicht ändern wie $ this-> Benutzer und $ this-> Nachricht, aber das wäre eine schmutzige und unintuitive Lösung. Ich würde gerne einen Ausweg finden, wo ich Variablen direkt ohne mit PHP einen Fehler aus, wenn eine nicht definierte Variable verwendet wird, verweisen kann.

Die Gedanken? Gibt es eine saubere Art und Weise, dies zu tun, oder bin ich zu Hacky Lösungen greifen gezwungen?

War es hilfreich?

Lösung

Bearbeiten Meine Antwort . Abit eines „Hack um“, aber eine mögliche Lösung. möchten die error_handler auf allgemeinere Funktionalität auf „Reset“.

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 Unbekannt years old.

Andere Tipps

Sie können mit Extrakt alle Variablen in den lokalen Bereich ziehen:

function display() {
    extract($this->varArray);
    include($this->filename);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top