PHP: Как реализовать __get-подобный метод для локальных функций переменных

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

  •  28-09-2019
  •  | 
  •  

Вопрос

Я не буду незнакомец __get () и использовал его, чтобы сделать некоторые очень удобные библиотеки в прошлом. Однако я сталкиваюсь с новой задачей (PHP 5.3, сокращенным и упростил мой код на этот вопрос):

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

?>

Выше представляет собой очень, очень упрощенную систему для загрузки вида. Этот код будет вызывать представление и отобразить его:

<?php

require_once("View.php");

use test\View;

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

?>

Моя цель для этого кода состоит в том, чтобы позволить представить «MyView.php» содержать такой код:

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

И, используется с вышеуказанным кодом, это выводило бы «Привет Том! Ваше электронное письмо ?? Email ??»

Однако это не будет работать. Вид включен в класс метода, поэтому, когда он относится к $ User и $ $, он ищет переменные локальные функции - не переменные, принадлежащие к классу View. По этой причине __get никогда не срабатывает.

Я мог бы изменить все переменные моими вида в такие вещи, как $ this-> User и $ this-> Email, но это было бы грязным и неразруситетным решением. Я хотел бы найти способ, где я могу напрямую ссылаться на переменные, не имея PHP бросить ошибку при использовании неопределенной переменной.

Мысли? Есть ли чистый способ сделать это, или я вынужден прибегать к хакерическим решениям?

Это было полезно?

Решение

Редактирование моего ответа. Отказ Абит «взлома», но потенциальное решение. Может захотеть «сбросить» сообщение об ошибке до более общей функциональности.

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.

Выход

Hello Tom, your email is email@host.com and your are Неизвестный years old.

Другие советы

Вы можете использовать извлекать Чтобы потянуть все переменные в локальный объем:

function display() {
    extract($this->varArray);
    include($this->filename);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top