Что лучше в PHP, статической или приватной переменной? - PullRequest
14 голосов
/ 19 мая 2011

Я заметил два способа сделать то же самое в 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

Ответы [ 3 ]

15 голосов
/ 19 мая 2011

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

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

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

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

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

9 голосов
/ 19 мая 2011

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

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

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

В других ответах я вижу некоторую путаницу между статическими переменными и статическими свойствами класса . 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().

4 голосов
/ 19 мая 2011

Ни один не "лучше".Это все равно, что спросить, лучше ли отвертка, чем шипорез.

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

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

...