2016-02-11 1 views
1

Я пытаюсь понять статическое поведение свойства в абстрактном class.this примера кода извлекается из PHP объектных моделей и практика книги (глава 11-орнамент):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; 
    } 
} 

от этого абстрактного класса распространяется ряд подклассов, а затем при создании экземпляра будет вызываться метод getKey(). Каждый проверяет его собственное свойство $key и, если его значение равно null, затем увеличиваем $keycount на единицу и присваиваем его $key.
как я понимаю $keycount сохранить последнее значение независимо от того, какой подкласс работает. я имею в виду, что это в контексте абстрактного класса НЕ контекст подклассов. если он был зависим от своего подкласса, тогда он будет сброшен на 0 в каждом подклассе. Кто-нибудь может дать мне больше информации об этом?

+1

Если вы хотите как количество каждого подкласса, а затем определить 'защищенный статический $ keycount = 0; и' protected $ key; 'в каждом подклассе, где вы хотите индивидуальное подсчет, и изменить' self :: $ keycount ++; $ this-> key = self :: $ keycount; 'to' static :: $ keycount ++; $ this-> key = static :: $ keycount; ' –

+1

Помните, что существует только один экземпляр переменной' Expression :: $ keycount'. Это то, что подразумевает «статический». Он доступен для экземпляра 'Expression'_. Таким образом, всякий раз, когда метод getKey() вызывается из любого экземпляра, он может обновлять переменную «один экземпляр» и только «выражение». Примечание. Каждый экземпляр имеет свою локальную переменную $ key. –

+0

@ RyanVincent спасибо. ваш комментарий может быть лучшим ответом – alex

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^