PHP: переменная, объявленная в абстрактном классе, не меняет своего значения по сравнению с классами cild - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь увеличить значение переменной, которая объявлена ​​в абстрактном классе, но каждый раз, когда я увеличиваю ее из дочерних классов, она продолжает присваивать 1 вместо увеличения ее значения в каждом экземпляре.

<?php
abstract class sum {
    private $sumResult = 0;
}
class test1 extends sum {
    private $sumResult;
    public function __construct() {
        $this->setSumResult();
    }
    public function setSumResult() {
        $this->sumResult++; //here I try to increase the value of the variable
    }
    public function getSumResult() {
        return $this->sumResult;
    }
}
class test2 extends sum {
    private $sumResult;
    public function __construct() {
        $this->setSumResult();
    }
    public function setSumResult() {
        $this->sumResult++; //here I try to increase the value of the variable
    }
    public function getSumResult() {
        return $this->sumResult;
    }
}
$test1 = new test1();
$test2 = new test2();
echo $test2->getSumResult(); //Here it prints out 1 instead of 2.
?>

Итак, я хочу увеличить значение переменной sumResult в каждом случае, но она не работает.В написанном мною коде должно возвращаться 2 вместо 1.

Что я делаю не так?

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Чтобы разделить переменную между всеми экземплярами классов, вам нужно объявить ее как static, и здесь я использую protected, чтобы позволить производным классам получить доступ к одному и тому же значению.Затем каждая ссылка на эту переменную выполняется с помощью self::$sumResult.Вам также не нужно объявлять переменную в каждом классе, так как это может скрыть поле в родительском классе.

abstract class sum {
    protected static $sumResult = 0;
}
class test1 extends sum {
    public function __construct() {
        $this->setSumResult();
    }
    public function setSumResult() {
        self::$sumResult++;
    }
    public function getSumResult() {
        return self::$sumResult;
    }
}
class test2 extends sum {
    public function __construct() {
        $this->setSumResult();
    }
    public function setSumResult() {
        self::$sumResult++;
    }
    public function getSumResult() {
        return self::$sumResult;
    }
}
$test1 = new test1();
$test2 = new test2();
echo $test2->getSumResult(); //Here it prints out 2.
0 голосов
/ 04 декабря 2018

Просто альтернативная версия тому, что опубликовали другие, если это может помочь.Более логично, imho, учитывая, как работают статические методы / свойства:

<?php
abstract class sum
{
  private static $sumResult = 0;

  public function __construct()
  {
    self::setSumResult();
  }

  public static function getSumResult()
  {
    return self::$sumResult;
  }

  private static function setSumResult()
  {
    self::$sumResult++;
  }
}

class test1 extends sum {}

class test2 extends sum {}

$test1 = new test1();
$test2 = new test2();
echo sum::getSumResult();
0 голосов
/ 04 декабря 2018

Классы предоставляют план построения экземпляров.Таким образом, каждый экземпляр имеет свой собственный набор переменных-членов.Изменение переменной-члена в одном экземпляре не меняет ее значения для другого экземпляра.

Поскольку нет правил без исключения, существуют static методы и члены.Они принадлежат классу, а не экземпляру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...