Я пытаюсь понять поведение статических свойств в абстрактном классе. Это пример кода, извлеченного из паттерны и практика php книга (глава 11-орнамент):
abstract class Expression {
private static $keycount=0;
private $key;
function getKey() {
if ( ! isset( $this->key ) ) {
self::$keycount++;
$this->key=self::$keycount;
}
return $this->key;
}
}
ряд подклассов расширяется от этого абстрактного класса, а затем getKey()
метод будет вызываться в момент создания экземпляра. $key
свойство и если его ноль, то увеличить $keycount
один и назначить его $key
имущество .
насколько я понимаю $keycount
сохранить его последнее значение независимо от того, на каком подклассе он работает. Я имею в виду, что это в контексте абстрактного класса, а не в контексте подклассов. если он зависит от своего подкласса, он будет сброшен в 0
в каждом подклассе. кто-нибудь может дать мне более глубокое понимание этого?
Похоже, вы отвечаете на свой вопрос.
как я понимаю, $ keycount сохраняет свое последнее значение независимо от того, на каком подклассе он работает
Да, это работает так. $keycount
распределяется между всеми подклассами.
Вот простой тест для проверки этого поведения:
<?php
abstract class Expression {
private static $keycount=0;
private $key;
function getKey() {
if ( ! isset( $this->key ) ) {
self::$keycount++;
$this->key=self::$keycount;
}
return $this->key;
}
}
class ChildOne extends Expression {
}
class ChildTwo extends Expression {
}
$one = new ChildOne();
print 'One get key: ' . $one->getKey().PHP_EOL;
print 'One get key: ' . $one->getKey().PHP_EOL;
$oneMore = new ChildOne();
print 'One more get key: ' . $oneMore->getKey().PHP_EOL;
print 'One more get key: ' . $oneMore->getKey().PHP_EOL;
$two = new ChildTwo();
print 'Two get key: ' . $two->getKey().PHP_EOL;
print 'Two get key: ' . $two->getKey().PHP_EOL;
Выход:
One get key: 1
One get key: 1
One more get key: 2
One more get key: 2
Two get key: 3
Two get key: 3
Других решений пока нет …