oop — поведение статического свойства PHP

Я пытаюсь понять поведение статических свойств в абстрактном классе. Это пример кода, извлеченного из паттерны и практика 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 в каждом подклассе. кто-нибудь может дать мне более глубокое понимание этого?

1

Решение

Похоже, вы отвечаете на свой вопрос.

как я понимаю, $ 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]