0

我一直在讨论 Zend_View 以及构成视图的各种类和接口。我试图在不以任何形式或形式使用 zend 的项目中复制的一件事是:

$this->view->variable = 'Hello world';

您可以在控制器中设置,然后执行:

echo $this->view->variable;

我的最终目标是做类似的事情:

$this->variable = new SomeClass

然后在其他地方,具体来说,做:

$this->variable->someMethod();

我的问题是:

  • 在不使用全局变量的情况下,我将如何复制 zend 所做的事情来做类似的事情?
  • zend 如何在不实例化或说明视图是什么的情况下执行 $this->view 之类的操作?

这将帮助我理解如何传递变量或将对象从逻辑传递到视图,以及 php 如何允许 $this->view 之类的东西在视图中或不在视图中工作。

注意:这不是 Zend 特定的问题,“使用 zend”不是答案。我正在寻找复制特定功能。我的项目不以任何方式使用或附属于 zend。

4

2 回答 2

1

我不知道你究竟为什么要实现这一点,但作为一个超级简单的设置(这绝不适合作为 MVC 框架的基础),你可以看看这个:

<?php
class Controller
{
    private $view = null;

    public function __construct()
    {
        $this->view = new View();
        $this->view->someVar = "foobar";
    }

    public function render()
    {
        include "view.php";
    }
}

class View
{

}

$controller = new Controller();
$controller->render();

然后,在 view.php 中,您可以执行以下操作:

<?php
echo $this->view->someVar;

当心:这段代码只显示了如何实现这样的结构,它根本没有任何用处;)。

于 2012-11-11T20:59:59.527 回答
0

其实很简单。当您使用include, require, evalet al. 时,加载的代码将被带入当前范围。所以如果你有一个模板文件

模板.php

<span><?=$this->view->somevar?></span>

控制器.php

<?php
class Controller
{
    private $view;

    public function doSomething()
    {
        $this->view->somevar = 'Hello World';
        include 'template.php';
    }
}

索引.php

<?php
require 'Controller.php';
$oC = new Controller();
$oC->doSomething();

Blamo.., template.php is able to call $this->view->somevar as it is treated as part of Controller.php. Running php index.php on the CLI produces

<span>Hello World</span>

To elaborate a tiny bit, if $this->view inside of Controller.php were a class you've defined rather than a simple instance of stdClass as in the above demonstration, and it had a function someMethod, you could call $this->view->someMethod() from template.php just the same.

于 2012-11-11T21:03:12.130 回答