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

はい、クラスを次のように変更するのはどうですか。

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 に答える
2

これを行う3つの方法を説明します。

  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 に答える
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

Mike、Sheikh、Kristianに感謝します。

あなたの言葉は私が答えを理解するのに役立たなかったので、私はすべての信仰であなたの答えにダニを与えることはできません。クラスに入ると、応答で指摘したエラーが発生します。しかし、私がサイトからそうすることを許可したとき、私はあなたのスコアを「上げ」ます。

これに対する答え、リマインダーを探している人にとって重要なのは、配列全体をクラスに格納しないことであり、メモリの膨大な浪費を生み出します。重要な点は、クラスの外部に存在する変数にアクセスすることです。

クラスの関数に含めることでグローバル$statsへのアクセスを追加する一方で、必要な結果が生成されますが、それでもデータがクラスに格納されている必要があります。申し訳ありませんが、最初からこれについてはっきりしていませんでした。

その代わり:

コード例:

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

}

これは、私が正しく理解していれば、$ stats変数へのポインターを使用しますが、stats配列を使用して変更された後に$valueAを返す範囲内でのみ使用されます。配列全体を別のメモリ位置にもクラスにもコピーしません。

于 2012-09-08T11:03:17.093 に答える