繁体   English   中英

php - 未声明对象的属性

[英]php - property of not declared object

我在Yii gen视图文件中找到此代码:

<?php
   $this->breadcrumbs=array(
      'Deal'=>array('deal/index'),
      'Create',
   );?>
   <h1><?php echo $this->id . '/' . $this->action->id; ?></h1>

   <p>You may change the content of this page by modifying the file <tt><?php echo __FILE__; ?></tt>.</p>

我知道$这实际上是一个对象,但我没有看到任何包含或对象声明,为什么我们有$ this-> id?

我是PHP的新手,也非常兴奋地学习它:)。 先谢谢

很多时候,框架会将视图加载到对象中,然后渲染它们。 这是其中一次。 在这种情况下,根据CViewRenderer的工作原理和renderInternal的工作原理,它将是一个CBaseController实例,并且(当然是CController实例)。

Yii使用以下视图渲染器(在CBaseController中):

public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
    {
        // we use special variable names here to avoid conflict when extracting data
        if(is_array($_data_))
            extract($_data_,EXTR_PREFIX_SAME,'data');
        else
            $data=$_data_;
        if($_return_)
        {
            ob_start();
            ob_implicit_flush(false);
            require($_viewFile_);
            return ob_get_clean();
        }
        else
            require($_viewFile_);
    }

正如您所看到的,您的视图在控制器的上下文中被调用,因此可以访问$ this(控制器)。 虽然使用控制器传递数据视图被认为是不好的做法,但是通过视图解析数据和访问其他功能(例如小部件)非常有用。

在您的代码示例中,即使视图位于布局内,控件的属性面包屑也可以由视图修改并由布局读取。 这是有效的,因为视图已呈现,然后插入到布局中。 另外值得注意的是,使用它是将数据传递给控制器​​布局的唯一方法。

虽然yii的文档很棒,但没有什么比打开源代码并了解它是如何工作更好的了。 毕竟,这是开源的全部要点:D

如果您的代码包含在函数内(在对象内),则意味着您的代码位于对象的范围内。

php中的每个包含都会让你使用“includer”中的变量,在你的情况下,$ this是一个有效的变量。

可能包含此文件或类方法中的某些内容。 如果包含它,当然,如果方法不是静态的,则可以使用$ this。

在你提供的代码中(除非有更多) $this->id实际上并不存在。

为了调试/理解目的,你可以调用一个

var_dump($this)

或者a

print_r($this)

在Yii和您提供的上下文(视图文件)中,“$ this”表示Controller对象。 “id”是控制器的名称,因此如果它是SiteController呈现的视图文件,“$ this-> id”将=“site”。 这并不奇怪,“$ this-> action-> id”=动作名称。

您是否遇到某种错误或只是想知道它是指什么? 如上所述,您可以使用print_r($this)打印出对象的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM