0

我对通过 PHP OO 的页面使用参数感到非常困惑。我正在关注有关创建框架的教程(就像 Zend 框架一样);但是,我不明白什么时候发生这种情况:

例如,索引:

// File: sourcefiles/index.php

define('DS', DIRECTORY_SEPARATOR);
define('ROOT', realpath(dirname(__FILE__)).DS );
define ('APP_PATH',(ROOT.'aplicacion'));

require_once APP_PATH. DS.'Config.php';
require_once APP_PATH. DS.'Request.php';
require_once APP_PATH. DS.'BootStrap.php';
require_once APP_PATH. DS.'Controller.php';
require_once APP_PATH. DS.'View.php';

try
{
    BootStrap::run(new Request());

我有:

 // File: sourcefiles/controladores/IndexController.php
 <?php
        class IndexController extends Controller
        {
            public function __construct() {
                parent::__construct();
            }

            public function indexAction() 
            {
                 $this->view->titulo='Homepage';
                 $this->view->contenido='Whatever';
                 $this->view->renderizar('index');   
            }
        }
   ?>

和这个:

// file : sourcefiles/aplicacion/View.php
<?php

class View
{
    private $controlador;
    private $layoutparams;

    public function __construct(Request $peticion)
    {
        $this->controlador = $peticion->getControlador();
    }

    public function renderizar($vista,$item=false)
    {
        $rutaview = ROOT.'vistas'.DS.$this->controlador.DS.$vista.'.phtml';

        if (is_readable($rutaview))
        {
            include_once $rutaview;
        }
        else
        {
            throw new Exception('Error de vista');
        }
    }
}
?>

这是视图:

// file : sourcefiles/vistas/index/index.phtml

<h1>
    Vista index..
    <?php
    echo $this->titulo;
    echo $this->contenido;
    ?>
</h1>

现在我的问题是:

IndexController 可以如何使用该行?$this->view->titulo = blabla; 视图类没有“titulo”属性;但是,我可以做到。但这是一件奇怪的事情,如果我在调用 之后这样做$this->view->renderizar('index'),我会收到错误消息。

index.phtml 文件是如何知道这一点的?echo $this->titulo;因为,没有调用 include 或 require,这让我感到困惑。

当我在文件中执行 require 或 include 调用时,所需或包含的文件知道调用者的变量吗?

如果有人可以向我解释这些,我将不胜感激:D 或将我链接到有关此的官方信息的讨论,或者如何称呼它?

4

1 回答 1

1

将一行includerequire一行视为将代码从一个文件“复制并粘贴”到另一个文件中。这不是很准确,但它解释了这里的部分行为:

sourcefiles/aplicacion/View.php你包括sourcefiles/vistas/index/index.phtmlwhile里面的功能View->renderizar。因此,所有代码都index.phtml被加载,就好像它也在该函数内部发生一样。例如,这就是您可以访问的原因$this

至于$this->view->titulo在你没有定义的时候引用,这是PHP让你偷懒。就像任何变量一样,对象上的成员会在您提及它时立即生效,只有一个通知警告您可能犯了错误。

于 2012-08-25T22:11:50.187 回答