настройка свойства общедоступного класса в Yii framework

#php #oop #yii

#php #ооп #yii

Вопрос:

В контроллере (который является классом с именем MessageController) есть этот код, который отображает файл «view» с именем HelloWorld, а также задает массив, где переменная $theTime связана с ключом ‘time’.

 $theTime = date("D M j G:i:s T Y"); 
$this->render('helloWorld',array('time'=>$theTime));
  

В файле view HelloWorld ключ ‘time’ от контроллера отображается здесь через переменную $time

 <h3><?php echo $time; ?></h3>
  

это работает отлично. Однако в книге также предлагается попробовать другой способ. В нем говорится

Измените предыдущий пример, определив свойство открытого класса в MessageController, а не локальную переменную, значением которой являются текущие дата и время. Затем отобразите время в файле просмотра, обратившись к этому свойству класса через $this.

Я не смог понять, как это сделать. Кто-нибудь знает, как

Ответ №1:

 class MessageController {
  public $time;

  public function beforeAction($action) {
    $this->time = date("D M j G:i:s T Y");
    return true;
  }

  public function someAction() {
    $this->render('helloWorld');
  

в представлении:

 echo $this->time;
  

Комментарии:

1. Я не думал, что у вас может быть выражение, вычисляющее подобную переменную, но я попытался, как вы предложили, и я получил эту ошибку Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный ‘(‘, ожидающий ‘,’или ‘;’ в /Applications/MAMP/htdocs/demo/protected/controllers/MessageController.php в строке 6

2. Я напутал там с кодом и сейчас редактирую. Yii Долгое время не вводил код. Я думаю, вам лучше поместить $this->time = date("D M j G:i:s T Y"); в beforeAction($action) метод.

3. @Nemoden это (то, как вы опубликовали это первым) не зависит от Yii, вы не можете присвоить свойству значение по умолчанию, если оно не является скалярным. Смотрите больше о свойствах в PHP 5 . Но теперь все в порядке, если beforeAction() выполняется.

4. @Tadeck, как я уже сказал: я напутал с кодом. Я это знаю 😉 Я просто сейчас часто переключаюсь с Python на PHP и обратно, так что это Pythonical особенность, вставленная в мой PHP код. И я не имел в виду, что это Yii особенность.

5. @Nemoden Хорошо, я понял. Я нахожусь в аналогичной ситуации (переключение Py и PHP) 😉

Ответ №2:

    // I defined $MyClassTime as a public class variable in "MessageController.php" 
    //as follows:

    class MessageController extends Controller
    {
        public $MyClassTime;

        public function actionHelloWorld()
        {
            $this->MyClassTime = "From Public Class Property: " . date("D M j G:i:s T Y");      

            $this->render('helloWorld');

        }

        public function actionIndex()
        {
            $this->render('index');
        }

    // And then did this in "helloWorld.com":

        <?php
        $this->breadcrumbs=array(
            'Message'=>array('message/index'),
            'HelloWorld',
        );?>
        <h1>Hello, World!!</h1> 
        <h3><?php echo $this->MyClassTime; ?></h3>
  

Ответ №3:

В controllers/MessageController.php файл

     class MessageController extends Controller
    {
       public $theTime;

       public function init()
       {
           $this->theTime = date("D M j G:i:s T Y");
       }

       public function actionHelloWorld()
       {
           $this->render('helloWorld',array('time'=>$this->theTime));
       }
     }
  

В views/message/helloWorld.php

     <h3><?php echo $time; ?></h3><hr/>
  

Ответ №4:

Хорошо, инструкция в книге конкретно гласит: «Измените предыдущий пример, определив свойство открытого класса в MessageController … … затем отобразите время в файле просмотра, обратившись к этому свойству класса через $this.

При этом это то, что я придумал:

В MessageController.php:

             class MessageController extends Controller
            {
                public $defaultAction = 'hello';
                public $theTime; // as per book's instructions

                public function actionHello()
                {
                    $this->theTime = date("D M j G:i:s T Y");
                    $this->render('hello');
                }
  

В protected/views/message/hello.php:

             <h1>Hello, World!</h1>
            <h3>
            <?php echo $this->theTime; ?>
            </h3>
  

У меня это работает, и я понимаю, что происходит в коде. Будучи новичком, это важно: знать, что вы делаете, и реализовывать это.