«Неопределенная переменная» в поле зрения при установке $ data ['variable'] в конструкторе; работает когда установлен в функцию

1

Если я установлю $data['error'] в функции index() и echo $error в представлении, это показано на моей странице просмотра. Однако, если я устанавливаю переменную в конструкторе, как показано ниже, и пытаюсь выполнить echo $error на странице просмотра, она показывает Severity:

Уведомление: неопределенная переменная: ошибка.

<?php

class Login extends CI_Controller
{

function __construct()
{
    parent::__construct();

    $data['error'] = 'hello';
}

function index()
{
    //$data['error'] = 'hello';

    $data['main_content'] = 'login';

    $this->load->view('inc/template', $data);
}
}
  • 0
    поскольку $ error не существует, $ data ['error'] существует ... Но эта переменная является локальной для этой функции __construct, как вы вообще пытаетесь получить к ней доступ?
  • 0
    Понимаю. Если я хочу установить начальное значение $ data ['error'] на 'hello', и я перенаправлю на страницу входа / индекс в другой функции и смогу переопределить начальное значение, как мне это сделать?
Теги:
codeigniter

4 ответа

1

Это объясняется тем, что здесь приведен краткий пример:

<?php

class Login extends CI_Controller
{
    /**
     * @var  array  only accessable within the scope of $this, inside Login class
     */
    private $data = [];

    public function __construct()
    {
        $foo = 'bar';
        $this->data = ['error' => 'hello'];
    }

    public function index()
    {
        var_dump($foo); // Severity: Notice Message: Undefined variable: foo
        // it only available in the scope of __construct()

        $this->data['main_content'] = 'login';

        // here you pass $this->data and then CI will extract the array keys
        // giving you access to the $error variable
        $this->load->view('inc/template', $this->data);
    }
}

Это точно так же, как с обычным процедурным PHP, у вас нет доступа к переменным в функциях без использования global $varName, вы должны передать переменные.

Я бы рекомендовал быстро прочитать основы

0

$data рассматриваются как разные в каждой функции контроллера

если вы создаете $data in constructor и то же самое в индексе, они рассматриваются как разные переменные, где их область также локальна

публичная функция __construct() должна содержать:

 allocating resources used in entire class ex. $this->load
 check user authentication (if entire class requires it)

public function index() должен содержать:

 allocating resources used only in this function
 calling views or displaying anything

помните ресурсы только в этой функции

или создать $ data в качестве глобальной переменной в классе и использовать его как $this->data где это необходимо

0

Похоже, вы не понимаете переменную область по этой проблеме.

Попробуйте что-то вроде этого.

class Login extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->data['error'] = 'hello';
    }
    function index()
    {
        //$data['error'] = 'hello';

        $data['main_content'] = 'login';
        $this->load->view('inc/template', $this->data);
    }
}

You can then also pass it to the view using the variable $this->data too.
  • 0
    $data['main_content'] = 'login'; должно быть $this->data['main_content'] = 'login'; и объявление переменной с соответствующей областью в классе public $data;
0

Да, поскольку вы только определяете $ data локально в функциональный блок конструктора

если вам нравится иметь переменную, доступную для любого из функциональных блоков класса

то вы можете создать новое свойство класса

public $data;
private $data;

тогда

на блоке конструктора вы можете использовать его как

$this->data['error'] = 'hellow';

и на блоке индекса функции

$this->data['main_content'] = 'login';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню