статическая функция php

108

У меня вопрос относительно статической функции в php.

предположим, что у меня есть класс

class test {
    public function sayHi() {
        echo 'hi';
    }
}

если я сделаю test::sayHi();это работает без проблем.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); тоже работает.

В чем разница между первым и вторым классом?

Что особенного в статической функции?

Луна
источник
15
Начиная с php7, вы не можете вызывать нестатический метод статически
санджай ядав

Ответы:

153

В первом классе sayHi()это фактически метод экземпляра, который вы вызываете как статический метод, и вам это сходит с рук, потому что sayHi()никогда не ссылается на $this.

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

Джонатан Фингланд
источник
22
Теперь статический вызов нестатических методов работает, но не рекомендуется. Будьте осторожны при использовании этого синтаксиса для экземпляров методов!
Джет,
1
Так почему они говорят, что это статическая функция? потому что не существует нескольких экземпляров с динамическим потоком данных и динамическим выводом. Просто направь меня. @ Chaos
вс,
22

Просто статические функции функционируют независимо от класса, к которому они принадлежат.

$ это означает, что это объект этого класса. Это не относится к статическим функциям.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'
user2132859
источник
9
Хорошо, я не мастер PHP, но разве переменная ('hello'), переданная статической функции, явно не перезаписывается с 'Hi'? Это означает, что строка print test1 :: sayHi ('hello'); не ответит "привет", а ответит "привет"?
Fnord23
6
Это неаккуратный ответ (эффект статических функций может зависеть от того, к какому классу они принадлежат), и примеры не очень ясно показывают суть.
Reinierpost
Не очень удачный пример. $ hi = 'Привет'; перезаписывает данный аргумент и не имеет ничего общего со статическим объявлением. Я бы исправил это так: self :: $ hi = $ hi; и он будет работать так же, как нестатический. Вы можете получить доступ к переменным класса с помощью self :: вместо $ this->
GotBatteries
20

Вся разница в том, что вы не попадаете $thisвнутрь статической функции. Если вы попытаетесь использовать $this, вы получите файл Fatal error: Using $this when not in object context.

Хорошо, хорошо, еще одно отличие: в E_STRICTвашем первом примере создается предупреждение.

хаос
источник
1
у меня нет предупреждения, когда я использую первый, и я нахожусь на php7
ашкан насирзаде
Почему у нас нет $ this внутри статической функции? Какова архитектурная логика этого? Спасибо.
Лукас Бустаманте
@LucasBustamante: $thisотносится к текущему объекту. В статической функции нет текущего объекта; функция существует в классе без необходимости или ссылки на экземпляр объекта этого класса.
хаос
3

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


источник
2

Короче говоря, у вас нет объекта как $ this во втором случае, поскольку статический метод - это функция / метод класса, а не экземпляр объекта.

Czimi
источник
1
статично просто как вы определяете функции класса? нет другого модного бизнеса? Так вы говорите, что если бы он назывался "class_method", а не "static", он был бы более семантическим?
ahnbizcad
1

Попробовав примеры (PHP 5.3.5), я обнаружил, что в обоих случаях определения функций вы не можете использовать $thisоператор для работы с функциями класса. Так что я пока не мог найти в них разницы. :(

йогеш
источник