1

我有一个对象需要访问我的统计信息中先前声明的数组。我当然可以在对象内部创建整个数组,但是由于多个对象使用完全相同的数组,因此没有理由在每次创建新数组时调用数据库来创建相同的数组来阻塞内存或时间目的。

所以,我知道对象不能访问全局变量,但是有什么解决方法可以从对象内部访问外部数组吗?

示例代码:

global $stats = array();
       $stats[1]['value']= 10;
       $stats[1]['value1'] =2;
       $stats[2]['value']= 12;
       $stats[2]['value1'] =1;

class Obj() {

  private $valueA;
  private $valueB;

  function __construct($user) {
    //access Database lets call $SQL;
    $valueA = SQL->value;

  }

  function showA() {
    return ( $valueA * $stats[1]['value1']) + $stats[1]['value'];
  }

}
4

4 回答 4

2

我会告诉你三种方法来做到这一点:

  1. 将数组传递给类的构造函数。例如:$myObject = new Obj( $stats );
  2. 创建一个为$stats数组提供服务的类:$stats = new Stats(); $statsArray = $stats->getStats();
  3. 在您的类本身(不是构造)中使用公共方法内部的术语global来获取该变量:3:

    function() somePublicMethod() {
        global $stats;
        $valueA = SQL->value * $stats[1]['value1'] + $stats[1]['value'];
        $valueB = SQL->value * $stats[2]['value1'] + $stats[2]['value'];
    }
    
于 2012-09-06T17:02:24.033 回答
2

是的,如何将您的课程更改为如下所示:

class Obj() {

  private $valueA;
  private $valueB;
  private $stats;

  function __construct($user, $stats) {
    $this->stats = $stats;
    //access Database lets call $SQL;
    $valueA = SQL->value * $this->stats[1]['value1'] + $this->stats[1]['value'];
    $valueB = SQL->value * $this->stats[2]['value1'] + $this->stats[2]['value'];
  }

  function showA() {
    return $valueA;
  }

}

您不仅仅是$stats在实例化时传递给对象。或者,如果您不想在构造函数中使用它,只需创建一个setStats($stats)执行相同操作的方法。

于 2012-09-06T16:57:59.663 回答
0

您可以从类中访问变量,即

$stats[1]['value']= 10;
$stats[1]['value1'] =2;
$stats[2]['value']= 12;
$stats[2]['value1'] =1;

class Obj {
    var $myStats;
    function __construct() {
        global $stats;
        $this->myStats= $stats;
        print_r($this->myStats);
    }
}

$obj=new Obj; // Array ( [1] => Array ( [value] => 10 [value1] => 2 ) [2] => Array ( [value] => 12 [value1] => 1 ) )

演示

于 2012-09-06T17:11:06.230 回答
0

感谢迈克、谢赫和克里斯蒂安,

我不能完全相信你的答案,因为你的话并没有帮助我理解答案,把'global $stats;' 进入课堂会导致我在回复中指出的错误。但是当我得到网站的许可时,我会“提高”你的分数。

对于任何寻求答案的人,提醒一下,关键是不要将整个 Array 存储在类中,从而造成巨大的内存浪费。关键是要访问存在于类之外的变量。

虽然通过将全局 $stats 包含在类的函数中来添加对全局 $stats 的访问,但确实会产生所需的结果,但它仍然需要将数据存储在类中,这再次与这一点相反。抱歉,我从一开始就不清楚这一点。

反而:

示例代码:

 function showA(&$stats) {
   return ( $valueA * $stats[1]['value1']) + $stats[1]['value'];
 }

}

如果我理解正确,这将使用指向 $stats 变量的指针,仅在使用 stats 数组修改后返回 $valueA 的范围内。不将整个数组复制到另一个内存位置,也不复制类。

于 2012-09-08T11:03:17.093 回答