【问题标题】:Passing an object to an included file oop php将对象传递给包含的文件 oop php
【发布时间】:2011-12-20 17:48:15
【问题描述】:

我正在开发一个 cms,我希望设计者能够在使用名为 $view 的对象时调用所有内容。我的问题是包含的模板文件不能再访问 $view-object 了。

视图对象包含 page_title() 等内容。 我也使用模板,所以我希望设计者能够通过访问 $view 对象来调用正确的模板。

一些代码来支持我的解释:

我的图书馆:

class view {
    function page_title() {}

    function template() {
       $this->template = new template;
       $this->template_include = $this->template->template_include();
    }
}

class template {
    function template_include(){
       include('template.php');
    }
}

我的索引文件:

$view = new view;
$view->template();

我的模板.php:

$view->page_title();

但是我遇到了一个问题:视图对象被创建,然后是,使用视图类中的一个方法,调用一个对象,该对象使用方法 template_include(),包含正确的 template.php。在这个模板中,我再次使用视图对象,以调用正确的标题、内容、... 我的问题是包含的模板文件不能再访问 $view-object 了。

猜猜你们都知道错误: 致命错误:在非对象上调用成员函数 field_title()

我致力于使这个 cms 对设计者/用户来说尽可能简单,所以我只希望视图对象调用所有内容,而不需要在模板文件等中包含额外的内容...

谢谢!

【问题讨论】:

    标签: php oop object include scope


    【解决方案1】:

    如果您在函数中包含模板文件,则此文件的内容将在此函数的范围内解释。解决它的最佳方法是将关联数组传递给此函数,其中包含您希望在此范围内拥有的变量,即:

    class view {
        function page_title() {}
    
        function template(array $variables) {
           $this->template = new template;
           $this->template_include = $this->template->template_include($variables);
        }
    }
    
    class template {
        function template_include(array $variables){
            if($variables){
                extract($variables);
            }
            include('template.php');
        }
    }
    

    现在通过这样调用它,您将可以访问模板中的 $view$title 变量:

    $view = new view;
    $vars = array(
        'view' => $view,
        'title' => 'some title'
    );
    $view->template($vars);
    

    【讨论】:

      【解决方案2】:

      您可以将$view 传递给方法/类

      索引

       $view = new view;
       $view->template($view);
      

       class view {
          function page_title() { echo "this works!!!";}
      
          function template($view) {
             $this->template = new template;
             $this->template_include = $this->template->template_include($view);
          }
      }
      
      class template {
          function template_include($view){
             include('template.php');
          }
      }
      

      【讨论】:

      • 非常感谢!这行得通。这是我第一次使用 OOP php,所以我希望我没有用这个(看似简单?)的问题来打扰大家。
      • 完全没有问题.. 使用 php 您也可以在函数定义中的变量名之前使用& 通过引用传递变量... function template(&$view) 但在这种情况下您不应该使用它...
      【解决方案3】:

      您是否尝试过全局声明 $view-object?

      global $view; 放入您的index.phptemplate.php,希望它能解决您的问题!

      【讨论】:

      • 谢谢,但是,我试过了,还是不行。作为测试,我尝试使用对象和“正常”包含(不包含在方法中),这可以正常工作。但当然,这不是我想要的:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      相关资源
      最近更新 更多