Здравствуйте, есть следующий код PHP: class A { public function foo() { static $x = 0; echo ++$x; } } class B extends A { } $a1 = new A; $b1 = new B; $a1->foo(); // 1 $b1->foo(); // 1 $a1->foo(); // 2 $b1->foo(); // 2 Как узнать сколько объектов и какого типа было создано? Иными словами как узнать значение переменной $x каждого класса.
Сделать переменную доступной, пример PHP: class A { static $x = 0; public function foo() { echo ++self::$x; } } class B extends A { } $a1 = new A; $b1 = new B; $a1->foo(); // 1 echo $a1::$x; //1 $b1->foo(); // 1 echo $b1::$x; $a1->foo(); // 2 echo $a1::$x; $b1->foo(); // 2 echo $b1::$x;
@Poznakomlus, в 21-й строке вывод уже не тот, что ожидается. @pr0n1x, например, можно сделать так, если оставаться в пределах статической переменной, объявленной в функции: Спойлер PHP: class A { public function incx() { static $x = 0; $x++; return $x; } public function foo() { echo $this->incx(); } } class B extends A { } $a1 = new A; $b1 = new B; $a1->foo(); // 1 $a1->foo(); // 2 $a1->foo(); // 3 $b1->foo(); // 1 $a1->foo(); // 4 $b1->foo(); // 2 --- Добавлено --- А если не оставаться, то: Спойлер PHP: class A { protected static $x = 0; public function foo() { static::$x++; echo static::$x; } } class B extends A { protected static $x = 0; } $a1 = new A; $b1 = new B; $a1->foo(); // 1 $a1->foo(); // 2 $a1->foo(); // 3 $b1->foo(); // 1 $a1->foo(); // 4 $b1->foo(); // 2 --- Добавлено --- Суть в переопределении статической переменной в классе-наследнике и использовании ключевого влова static, обеспечивающего "позднее статическое связывание" вместо self при обращении к этой переменной из метода.
PHP: class A { use C; } class B { use C; } trait C { static $x = 0; public function foo() { echo ++self::$x; } } Спойлер: Результат PHP: $a1 = new A; $b1 = new B; $a1->foo(); // 1 echo $a1::$x; //1 $b1->foo(); // 1 echo $b1::$x; // 1 $a1->foo(); // 2 echo $a1::$x; // 2 $b1->foo(); // 2 echo $b1::$x; // 2