在PHP中,类中是否可能有一个函数';它是非静态的,但也不是';它不是一个实例函数吗?

在PHP中,类中是否可能有一个函数';它是非静态的,但也不是';它不是一个实例函数吗?,php,oop,class,instantiation,class-method,Php,Oop,Class,Instantiation,Class Method,在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; //

在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
我是否可以向该类添加一个函数,该函数可以“可见性”其自身的所有实例,这样我就可以这样做(我知道这样做不起作用,但传达了我的想法):

我猜
A::getTotal()
意味着
getTotal()
需要是静态的,但是如果它是静态的,那么它就不能“看到”每个类实例


这类事情可能发生吗?我应该使用什么正确的术语?

不,没有内置的实例枚举,您需要自己保留对每个实例化对象的引用。您可以在类的静态属性中保留实例数组,并将其填充到
\u构造()
中。然后,您可以在此数组上有一个静态方法循环并处理所有实例。

不,没有内置实例枚举,您需要自己保留对每个实例化对象的引用。您可以在类的静态属性中保留实例数组,并将其填充到
\u构造()
中。然后,您可以在此数组上有一个静态方法循环,并处理所有实例。

只需将sum的类成员设置为静态即可。如果这样做,则需要确保在每个类中正确维护该值(即,
setValue
需要适当地更新该值)

不过,这可能不是一种很好的做事方式。我想这会让人很困惑。在什么样的上下文中,您需要无法访问所有实例的sum?

只需将sum的类成员设置为静态即可。如果这样做,则需要确保在每个类中正确维护该值(即,
setValue
需要适当地更新该值)


不过,这可能不是一种很好的做事方式。我想这会让人很困惑。在什么情况下,您需要无法访问所有实例的总和?

我想您需要这样的总和:

 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”。但它只获取当前范围内的变量

我想你会喜欢这样的:

 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”。但它只获取当前范围内的变量

您是否正在寻找受保护的函数foo($s){…},该类可以使用,但不能从外部访问?(仅限PHP5)

您是否正在寻找一个受保护的函数foo($s){…},该函数类可以使用,但不能从外部访问?(仅限PHP5)

…或者您可以保留一个静态计数器变量,并在其值更改时让所有实例对其进行修改。您需要将实例值
设为private
,并提供一个setter使其工作。但是+1表示通常正确的答案。我假设
sum()
示例只是一个示例。并不是每一个这样的聚合都可以在每次更改时有效地预先计算,所以我建议一种更通用的方法是有意义的……或者您可以保留一个静态计数器变量,并让所有实例在其值更改时对其进行修改。您需要将实例值
设为private
,并提供一个setter使其工作。但是+1表示通常正确的答案。我假设
sum()
示例只是一个示例。并不是每一个这样的聚合都可以在每次更改时有效地预先计算,所以我建议一种更通用的方法是有意义的。