PHP: Как реализовать __get-подобный метод для локальных функций переменных
Вопрос
Я не буду незнакомец __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);
}