为什么可以';我是否可以从类函数访问PHP5类中公共变量的值?

为什么可以';我是否可以从类函数访问PHP5类中公共变量的值?,php,oop,codeigniter,Php,Oop,Codeigniter,我在Apache2.2.14和MySQL5.1.48-community上使用带有PHP5.3.2的CodeIgniter 2.0。我创建了一个小型测试控制器来隔离另一个问题,并发现我的问题似乎是由公共变量可访问性引起的。调用test1或test2将导致错误,因为它们看不到在其他函数中设置的数组元素的值。有人知道为什么这样不行吗?如果是这样,那么解决方案是什么,因为我需要能够访问类范围的变量 谢谢 <?php class Test extends CI_Controller { pub

我在Apache2.2.14和MySQL5.1.48-community上使用带有PHP5.3.2的CodeIgniter 2.0。我创建了一个小型测试控制器来隔离另一个问题,并发现我的问题似乎是由公共变量可访问性引起的。调用test1或test2将导致错误,因为它们看不到在其他函数中设置的数组元素的值。有人知道为什么这样不行吗?如果是这样,那么解决方案是什么,因为我需要能够访问类范围的变量

谢谢

<?php
class Test extends CI_Controller
{
  public $data;

  function __construct()
  {
    parent::__construct();
    $this->data = array();
  }

  function index()
  {
    $this->data['test1'] = 'This is a test of class public variable access.<br />';         
    echo 'Class index() called.<br />';
    echo $this->data['test1'];  
  }

  function test1()
  {
    $this->data['test2'] = 'This is a second test of the class public variable access.<br />';          
    echo 'Class test1 called.<br />';
    echo $this->data['test1'];  
    echo $this->data['test2'];  
  }

  function test2()
  {
    echo 'The data array contains these two entries:<br />';
    echo $this->data['test1'];  
    echo $this->data['test2'];  
  }
}
/* End of file test.php*/
/* Location: */

错误在您的代码中。当您
\u construct()
类时,
$this->data
等于
数组()
。空数组。唯一应该工作的行是
test1()函数中的最后一行

index()
test1()
中删除所有echo语句,然后尝试以下操作:

  function test2()
  {
      $this->index();
      $this->test1();
      echo 'The data array contains these two entries:<br />';
      echo $this->data['test1'];  
      echo $this->data['test2'];  
    }
函数test2()
{
$this->index();
$this->test1();
echo“数据数组包含以下两个条目:
”; echo$this->data['test1']; echo$this->data['test2']; }
这应该是可行的,因为现在您已经通过运行定义这些数组键的函数定义了它们


如果您需要在类的每个方法中访问它们,请尝试在您的
\u构造中定义它们。

这些方法是如何调用的,以什么顺序调用的,输出是什么?错误消息的确切措辞是什么?无法通过查看此代码来判断。。。需要CI_控制器和错误消息详细信息。错误消息是:[code]遇到PHP错误严重性:注意消息:未定义索引:test1文件名:controllers/test.PHP行号:26[/code]我猜第26行在
test1()
中?您总是在调用
test1()
之前调用
index()
?因为除非您这样做,否则索引是未定义的。事实证明,问题是每次调用函数时CodeIgniter都会创建一个新的控制器对象实例,而不是正确地创建一个单例对象。因此,对不同函数的每次调用都是针对不同的对象和不同的数据,这意味着以前函数存储的任何数据都不可用。我建议您回答自己的问题并接受它,因为您完全正确:)@user我不知道CI的具体情况,但通常每个请求只调用一个控制器操作。除非在一个请求中显式调用多个方法,否则这不是单例对象的问题,而是请求之间的数据持久性问题(在PHP中不会发生这种情况)。