Что лучше в 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
Ничего не лучше. Это было бы похоже на вопрос, лучше ли отвертка лучше, чем шипорез.
Частная переменная в вашем первом примере будет доступна только для этого экземпляра класса (хотя и только для его методов). Создайте новый экземпляр, и переменная может и будет иметь другое значение.
Статическая переменная во втором примере будет доступна для всех экземпляров этого класса, по общему признанию, только в этом методе. Но установите один экземпляр, а второй экземпляр увидит то же значение.