"未定义的变量"在构造函数中设置$ data ['变量']时的视图;在功能设置时工作

时间:2015-08-13 06:03:29

标签: php codeigniter

如果我在功能$data['error']index()中设置echo $error,则会在我的视图页面中显示。但是,如果我在构造函数中设置变量,如下所示,并在视图页面中尝试echo $error,则会显示严重性:

  

通知消息:未定义的变量:错误。

<?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);
}
}

4 个答案:

答案 0 :(得分: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's 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的情况下访问函数中的变量,您必须传入变量。

我建议快速阅读the basics

答案 1 :(得分:0)

是的,因为您只在本地定义$ data到构造函数块

如果您希望任何类功能块可以访问变量

然后你可以创建一个新的属性

public $data;
private $data;

然后

在构造函数块上,您可以像

一样使用它
$this->data['error'] = 'hellow';

并在函数索引块

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

答案 2 :(得分:0)

$data在控制器的每个功能中被视为不同

如果在构造函数中创建$data且索引中相同,则将它们视为不同的变量,其范围也是本地的

  

public function __construct()应该包含:

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

公共功能索引()应包含:

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

仅在此功能中记住资源

或在类中创建$ data作为全局变量,并在需要的地方将其用作$this->data

答案 3 :(得分: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.