Статические переменные в PHP - PullRequest
       3

Статические переменные в PHP

28 голосов
/ 22 сентября 2011

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

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

Однако я пытался исследовать, что статическая переменная делает внутри функции, которой нет в классе.Кроме того, статическая переменная в функции работает как закрытие в javascript или я полностью отключен в этом предположении?

Ответы [ 5 ]

35 голосов
/ 22 сентября 2011

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

Это зависит от того, что вы подразумеваете под этим.Например:

class Foo {
    static $my_var = 'Foo';
}

$x = new Foo();

echo $x::$my_var;  // works fine
echo $x->my_var;   // doesn't work - Notice: Undefined property: Foo::$my_var

и что статический метод может использоваться объектом, созданным классом ???

Да, экземпляр объекта, принадлежащий классу, может обращаться к статическому методу.

Ключевое слово static в контексте классов ведет себя подобно статическим переменным класса в других языках.Член (метод или переменная), объявленный static, связан с классом, а не с экземпляром этого класса.Таким образом, вы можете получить к нему доступ без экземпляра класса (например: в приведенном выше примере я мог бы использовать Foo::$my_var)


Однако я пытался исследовать, что такое статическийПеременная делает внутри функции, которой нет в классе.

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

Но, в отличие от замыканий JS, переменная поддерживается только в одном значении при разных вызовах одной и той же функции.Из примера руководства по PHP:

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

test();  // prints 0
test();  // prints 1
test();  // prints 2

Ссылка: static ключевое слово (в классах) , (в функциях)

23 голосов
/ 22 сентября 2011

static имеет два варианта использования в PHP:

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

class A {
  public static $var = 'val'; // $var is static (in class context)
  public $other_var = 'other_val'; // non-static
}

echo A::$var; // val
echo A::$other_var // doesn't work (fatal error, undefined static variable)

$a = new A;
echo $a->var // won't work (strict standards)
echo $a->other_var // other_val

Во-вторых, его можно использовать для поддержания состояния между вызовами функций:

function a() {
  static $i = 0;
  $j = 0;
  return array($i++, $j++);
}
print_r(a()); // array(0, 0)
print_r(a()); // array(1, 0)
print_r(a()); // array(2, 0)
//...

Обратите внимание, что объявление статической переменной внутри функции работает одинаково независимо от того, определена ли функция в классе, все, что имеет значение, - это то, где объявлена ​​ переменная (член класса или функция ).

7 голосов
/ 07 октября 2015

Статическая переменная в функции инициализируется только при первом вызове этой функции в запущенном скрипте.

1 голос
/ 09 декабря 2016

Сначала я объясню, что произойдет, если статическая переменная не используется

<?php
function somename() {
    $var = 1;
    echo $var . "<br />";
    $var++;
}
somename();
somename();
somename();
?>

Если вы запустите приведенный выше код, вы получите 1 1 1.Поскольку каждый раз, когда вы вызываете эту переменную функции, присваиваете 1, а затем печатает ее.


Теперь давайте посмотрим, что если используется статическая переменная

<?php
function somename() {
    static $var = 1;
    echo $var . "<br />";
    $var++;
}
somename();
somename();
somename();
?>

Теперь, еслиВы запускаете этот фрагмент кода, результат будет 1 2 3.

Примечание: Статический сохраняет свое значение и остается неизменным при каждом вызове функции.Он не потеряет своего значения при вызове функции.

0 голосов
/ 05 июня 2017
class Student {
static $total_student = 0;
static  function add_student(){
    return Student::$total_student++;
}
}

Во-первых: для функции add_student рекомендуется использовать static, а не public.Второе: в функции add_student мы используем Student :: $ total_student, а не использовать $ this-> total_student.Это сильно отличается от обычной переменной.В-третьих: статические переменные являются общими для всего дерева наследования.

используйте приведенный ниже код, чтобы увидеть результат:

class One {
static $foo ;
}
class Two extends One{}
class Three extends One{}
One::$foo = 1;
Two::$foo = 2;
Three::$foo = 3;
echo One::$foo;
echo Two::$foo;
echo Three::$foo;`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...