0

PHPでは、非静的であるがインスタンス関数ではない関数をクラス内に持つことは可能ですか?

たとえば、次のような場合です。

class A
{
   public $i;

   function setValue($val) {
      $this->i = $val;
   }
}  

$a1 = new A;
$a1->setValue(5);
echo $a1->i; // result: 5

$a2 = new A;
$a2->setValue(2);
echo $a2->i; // result: 2

そのクラスに、それ自体のすべてのインスタンスの「可視性」を持つことができる関数を追加して、そのようなことを実行できますか(これは機能しないことはわかっていますが、私の考えを伝えます):

class A
{
   public $i;

   function setValue($val) {
      $this->i = $val;
   }

   function getTotal() {
      return sum($this->i); // I know sum() isn't a built-in function, but it helps explain what I want. I'm not sure if $this makes sense here too.
   }
}  

$a1 = new A;
$a1->setValue(5);
echo $a1->i; // result: 5

$a2 = new A;
$a2->setValue(2);
echo $a2->i; // result: 2

echo A::getTotal(); // returns: 7

A::getTotal()つまり、静的である必要があると思いgetTotal()ますが、静的である場合、各クラスインスタンスを「見る」ことはできません。

この種のことは可能ですか、そして私が使用すべき正しい用語は何ですか?

4

4 に答える 4

4

いいえ、組み込みのインスタンス列挙はありません。インスタンス化された各オブジェクトへの参照を自分で保持する必要があります。インスタンスの配列をクラスの静的プロパティに保持し、にデータを設定できます__construct()。次に、この配列に対して静的メソッドループを作成し、すべてのインスタンスを処理できます。

于 2012-07-03T13:25:48.720 に答える
1

私はあなたがこのようなものが欲しいと思います:

 class A
{
   public $i;

   function setValue($val) {
      $this->i = $val;
   }
}  

$a1 = new A;
$a1->setValue(5);
echo $a1->i; // result: 5

$a2 = new A;
$a2->setValue(2);
echo $a2->i; // result: 2

$total = 0;
foreach( get_defined_vars() as $name => $obj ) {
  if ( $obj instanceof A ) {
    $total += $obj->i;
  }
}
echo $total; // returns: 7

ここで必要な関数は「get_defined_vars」です。ただし、現在のスコープ内の変数のみを取得します。

于 2012-07-03T13:48:52.140 に答える
0

合計のクラスメンバーも静的にします。これを行う場合は、各クラス内で適切に維持されていることを確認する必要があります(つまりsetValue、その合計を適切に更新する必要があります)。

ただし、これはおそらく物事を行うための優れた方法ではありません。かなり混乱するだろうと思います。どのような状況で、すべてのインスタンスにアクセスできない合計が必要ですか?

于 2012-07-03T13:31:47.250 に答える
0

protected function foo($s){...}クラスは使用できるが、外部からはアクセスできないものをお探しですか?(PHP5のみ)

于 2012-07-03T14:53:17.417 に答える