__toString проблемы - PullRequest
       21

__toString проблемы

2 голосов
/ 14 декабря 2009

Я строю небольшую систему MVC (обучение), и у меня есть некоторые проблемы с отображением переменных в моих файлах просмотра.

Это из моего класса Просмотр:

private $vars = array();

    public function __set($key, $value)
    {
        $this->vars[$key] = $value;
    }


    public function __get($key)
    {
        return $this->vars[$key];
    }

    public function __toString()
    {
        return $this->vars[$key];
    }

    public function show($file)
    {
        global $router;
        $folder = strtolower($router->current_controller);

        $path = VIEWPATH.$folder.'/'.$file.'.phtml';
        if ( ! file_exists($path))
        {
            die("Template: $file, not found");
        }
        include ($path);
    }

А вот с моего контроллера:

$test = new View();
$test->name = 'karl';
$test->show('name_view'); 

И просмотр файла (name_view)

echo $name // doesn't work
echo $this->name // Works

Что я делаю не так? Возможно, я сделаю что-то глобальное?

THX / Тобиас

РЕДАКТИРОВАТЬ: я только что извлек массив vars в классе представления, прежде чем я включил файл представления, и затем он работал .. Спасибо за помощь.

1 Ответ

6 голосов
/ 14 декабря 2009

В __toString () нет ключа $!

Также __toString () не принимает никаких параметров!

Проверьте это с помощью:

public function __toString()
{
    return json_encode($this->vars);
}

После вашего редактирования я понял, что ваша проблема не в методе __toString () (вы можете просто удалить его, поскольку вы его не используете). Выполнение echo $this->name - это правильный способ показать переменные изнутри вашего представления в вашем случае, однако, если вы хотите просто сделать echo $name, могу ли я предложить другой подход?

function View($view)
{
    if (is_file($view) === true)
    {
        $arguments = array_slice(func_get_args(), 1);

        foreach ($arguments as $argument)
        {
            if (is_array($argument) === true)
            {
                extract($argument, EXTR_OVERWRITE);
            }
        }

        require($view);
    }
}

Используйте функцию просмотра следующим образом:

$data = array
(
   'name' => 'karl',
);

View('/path/to/your/name_view.phtml', $data);

Теперь он должен работать просто, выполнив echo $name;, вы можете адаптировать его к вашему классу View, если хотите. Если это не сработает, попробуйте изменить расширение представления name_view на .php.

...