php - свойство не объявленного объекта - PullRequest
0 голосов
/ 27 июля 2011

Я нахожу этот код, когда 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, а также очень рад его изучению :). Сначала спасибо.

Ответы [ 7 ]

1 голос
/ 27 июля 2011

Часто фреймворки загружают представления в объекты, а затем визуализируют их. Это один из тех моментов. В этом случае, в зависимости от того, как работает CViewRenderer и renderInternal, это будет экземпляр CBaseController и (чаще всего) текущий экземпляр CController.

1 голос
/ 29 июля 2011

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 (controller).Хотя считается плохой практикой передавать представление данных с помощью контроллера, это полезно для анализа данных между сквозными представлениями и доступа к другим функциям (таким как виджеты).

В вашем примере кода могут быть использованы хлебные крошки свойства контроллерамодифицируется видом и читается макетом, даже если вид находится внутри макета.Это работает, потому что представление отображается и затем вставляется в макет.Также стоит отметить, что использование этого является единственным способом передачи данных в макеты из контроллера.

Хотя документация yii великолепна, нет ничего лучше, чем открыть исходный код и посмотреть, как он работает.Ведь в этом весь смысл открытого кода: D

0 голосов
/ 28 июля 2011

В Yii и контексте, который вы представляете (файл представления), «$ this» представляет объект Controller. «Id» - это имя контроллера, поэтому, если это был файл представления, отображаемый SiteController, «$ this-> id» бы = «site». Не удивительно, что «$ this-> action-> id» = имя действия.

Вы получаете какую-то ошибку или просто задаетесь вопросом, к чему это относится? Как уже упоминалось, вы можете распечатать содержимое объекта с помощью print_r($this).

0 голосов
/ 27 июля 2011

для целей отладки / понимания вы можете назвать

var_dump($this)

или

print_r($this)
0 голосов
/ 27 июля 2011

В коде, который вы указали (если нет больше) $this->id на самом деле не существует.

0 голосов
/ 27 июля 2011

Возможно, этот файл включен или что-то в методе класса.Если он включен, можно будет использовать $ this, если метод не является статичным, конечно.

0 голосов
/ 27 июля 2011

Если ваш код включен в функцию (внутри объекта), это означает, что вы находитесь в области видимости объекта.

Каждое включение в php позволит вам использовать переменные внутри «includeder»,в вашем случае $ это допустимая переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...