Если я установлю $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);
}
}
Это объясняется тем, что здесь приведен краткий пример:
<?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
, вы должны передать переменные.
Я бы рекомендовал быстро прочитать основы
$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
где это необходимо
Похоже, вы не понимаете переменную область по этой проблеме.
Попробуйте что-то вроде этого.
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.
$data['main_content'] = 'login';
должно быть $this->data['main_content'] = 'login';
и объявление переменной с соответствующей областью в классе public $data;
Да, поскольку вы только определяете $ data локально в функциональный блок конструктора
если вам нравится иметь переменную, доступную для любого из функциональных блоков класса
то вы можете создать новое свойство класса
public $data;
private $data;
тогда
на блоке конструктора вы можете использовать его как
$this->data['error'] = 'hellow';
и на блоке индекса функции
$this->data['main_content'] = 'login';