PHP对象试图访问外部数组

时间:2012-09-06 16:52:26

标签: php oop variables

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

所以,我理解对象无法访问全局变量,但有没有解决方法从对象内部访问外部数组?

示例代码:

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 个答案:

答案 0 :(得分: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)方法。

答案 1 :(得分: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'];
    }
    

答案 2 :(得分: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 ) )

DEMO

答案 3 :(得分:0)

感谢Mike,Sheikh和Kristian,

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

对于任何寻找答案的人来说,一个提醒,关键是不要将整个数组存储在类中,造成巨大的内存浪费。关键点是访问存在于类外的变量。

虽然通过将全局$ stats包含在类的函数中来添加对全局$ stats的访问,但确实产生了所需的结果,它仍然需要将数据存储在类中,这又是一个重点。对不起,我从一开始就不清楚这一点。

相反:

示例代码:

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

}

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