За последние 24 часа нас посетили 22825 программистов и 1258 роботов. Сейчас ищут 707 программистов ...

Как получить доступ к статической переменной

Тема в разделе "PHP для профи", создана пользователем pr0n1x, 1 сен 2018.

  1. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    Здравствуйте, есть следующий код

    PHP:
    1. class A {
    2.   public function foo() {
    3.     static $x = 0;
    4.     echo ++$x;
    5.   }
    6. }
    7.  
    8. class B extends A {
    9. }
    10.  
    11. $a1 = new A;
    12. $b1 = new B;
    13.  
    14. $a1->foo(); // 1
    15. $b1->foo(); // 1
    16. $a1->foo(); // 2
    17. $b1->foo(); // 2
    Как узнать сколько объектов и какого типа было создано? Иными словами как узнать значение переменной $x каждого класса.
     
  2. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Сделать переменную доступной, пример
    PHP:
    1. class A
    2. {
    3.     static $x = 0;
    4.  
    5.     public function foo()
    6.     {
    7.  
    8.         echo ++self::$x;
    9.     }
    10. }
    11.  
    12. class B extends A
    13. {
    14. }
    15.  
    16. $a1 = new A;
    17. $b1 = new B;
    18.  
    19. $a1->foo(); // 1
    20. echo $a1::$x; //1
    21. $b1->foo(); // 1
    22. echo $b1::$x;
    23. $a1->foo(); // 2
    24. echo $a1::$x;
    25. $b1->foo(); // 2
    26. echo $b1::$x;
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Poznakomlus, в 21-й строке вывод уже не тот, что ожидается.
    @pr0n1x, например, можно сделать так, если оставаться в пределах статической переменной, объявленной в функции:
    PHP:
    1. class A
    2. {
    3.     public function incx() {
    4.         static $x = 0;
    5.         $x++;
    6.         return $x;
    7.     }
    8.  
    9.     public function foo()
    10.     {
    11.         echo $this->incx();
    12.     }
    13. }
    14.  
    15. class B extends A
    16. {
    17. }
    18.  
    19. $a1 = new A;
    20. $b1 = new B;
    21.  
    22. $a1->foo(); // 1
    23. $a1->foo(); // 2
    24. $a1->foo(); // 3
    25. $b1->foo(); // 1
    26. $a1->foo(); // 4
    27. $b1->foo(); // 2
    --- Добавлено ---
    А если не оставаться, то:
    PHP:
    1. class A
    2. {
    3.     protected static $x = 0;
    4.     public function foo()
    5.     {
    6.     static::$x++;
    7.         echo static::$x;
    8.     }
    9. }
    10.  
    11. class B extends A
    12. {
    13.     protected static $x = 0;
    14. }
    15.  
    16. $a1 = new A;
    17. $b1 = new B;
    18.  
    19. $a1->foo(); // 1
    20. $a1->foo(); // 2
    21. $a1->foo(); // 3
    22. $b1->foo(); // 1
    23. $a1->foo(); // 4
    24. $b1->foo(); // 2
    --- Добавлено ---
    Суть в переопределении статической переменной в классе-наследнике и использовании ключевого влова static, обеспечивающего "позднее статическое связывание" вместо self при обращении к этой переменной из метода.
     
    Poznakomlus нравится это.
  4. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    PHP:
    1. class A
    2. {
    3.    use C;
    4. }
    5.  
    6. class B
    7. {
    8.     use C;
    9. }
    10.  
    11. trait C
    12. {
    13.     static $x = 0;
    14.  
    15.     public function foo()
    16.     {
    17.  
    18.         echo ++self::$x;
    19.     }
    20. }
    PHP:
    1. $a1 = new A;
    2. $b1 = new B;
    3.  
    4. $a1->foo(); // 1
    5. echo $a1::$x; //1
    6. $b1->foo(); // 1
    7. echo $b1::$x; // 1
    8. $a1->foo(); // 2
    9. echo $a1::$x; // 2
    10. $b1->foo(); // 2
    11. echo $b1::$x; // 2