Что лучше в PHP, Static Variable или Private Variable?

Я заметил два способа в PHP сделать то же самое. Можете ли вы сказать мне, какой путь является лучшей практикой программирования?

В первом примере я использую приватную переменную класса. Во втором примере я использую статическую переменную в методе класса.

class Test {
  private $_myvar;
  public function getVar(){
    if (!isset($this->_myvar)) {
      $this->_myvar = "test\n";
    }
    return $this->_myvar;
  }
}
$oTest = new Test();
echo $oTest->getVar(); // sets var first time and returns it
echo $oTest->getvar(); // pulls from cache

Или:

class Test {
  public function getVar(){
    static $myvar;
    if (!isset($myvar)) {
      $myvar = "test\n";
    }
    return $myvar;
  }
}
$oTest = new Test();
echo $oTest->getVar(); // sets var first time and returns it
echo $oTest->getvar(); // pulls from cache

Ответы

Ответ 1

С свойством класса (будь он общедоступным, приватным или защищенным) переменная доступна для других частей класса.

Со статической переменной она видна только этому методу класса.

Я бы предложил использовать свойство класса (но, вероятно, не личное, что, как правило, не очень полезно для использования, как правило, это лучшая идея), так как это проще для тестирования позже; вы не можете ничего сделать, чтобы отменить, изменить или проверить статическую переменную.

Я вижу некоторую путаницу в других ответах между статическими переменными и свойствами статического класса. PHP использует тот же модификатор, но поведение совсем другое; Далее следует пример.

<?php
class Foo {
   // Static class property
   public static $bar = 'bar';

   public function blarg() {
      static $bar;
      if (empty($bar)) {
         $bar = 'blarg';
      }
      return $bar;
   }
}

В приведенном выше примере статическое свойство класса можно получить с помощью Foo::$bar (или self::$bar внутри класса и static::$bar в PHP 5.3); статическая переменная не может и видна только внутри функции blarg().

Ответ 2

Это как сказать, в какой комнате лучше Кухня или Ванная, они обе комнаты, но у них разные функции.

A static переменная одинакова для нескольких объектов.

Переменная экземпляра, объявленная с помощью private выше, относится к определенному объекту.

Обратите внимание, что private - модификатор доступа, static - нет, переменная может быть как.

В месте, где у вас есть переменная static, внутри этой функции она не является переменной класса/объекта вообще, а является традиционной переменной static на уровне функции, которая будет единичной для всех вызовов что делает его похожим на переменную static на уровне класса, но доступен только внутри метода, в котором он определен внутри.

Ответ 3

Ничего не лучше. Это было бы похоже на вопрос, лучше ли отвертка лучше, чем шипорез.

Частная переменная в вашем первом примере будет доступна только для этого экземпляра класса (хотя и только для его методов). Создайте новый экземпляр, и переменная может и будет иметь другое значение.

Статическая переменная во втором примере будет доступна для всех экземпляров этого класса, по общему признанию, только в этом методе. Но установите один экземпляр, а второй экземпляр увидит то же значение.