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

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

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

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

30
задан NullUserException 22 September 2011 в 01:26
поделиться

3 ответа

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

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

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 ключевое слово (в классах) , (в функциях)

39
ответ дан 27 November 2019 в 23:26
поделиться

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

7
ответ дан 27 November 2019 в 23:26
поделиться
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;`
0
ответ дан 27 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: