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


108

У мене питання щодо статичної функції в php.

припустимо, що у мене є клас

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

якщо я test::sayHi();це роблю, це працює без проблем.

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

test::sayHi(); працює також.

Які відмінності між першим і другим класом?

У чому особливість статичної функції?


15
Станом на php7 статично не можна назвати статичний метод
sanjay yadav

Відповіді:


153

У першому класі - sayHi()це фактичний метод екземпляра, який ви викликаєте як статичний метод, і ви ухиляєтесь від нього, оскільки sayHi()ніколи не посилається на нього $this.

Статичні функції асоціюються з класом, а не екземпляром класу. Як такий, $thisвін недоступний зі статичного контексту ( $thisне вказує на будь-який об’єкт).


22
Зараз статичне виклик нестатичних методів працює, але застаріло. Будьте обережні, використовуючи цей синтаксис, наприклад, методи!
Jet

1
Отже, чому вони говорять про це як статичну функцію? тому що не існує декількох примірників з динамічним потоком даних та динамічним виведенням. Просто направляйте мене. @ Хаос
сонце,

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'

9
Гаразд, я не майстер PHP, але чи не є змінна ("привіт"), яка передається статичній функції, явно перезаписується "Привіт"? Це означає, що тест друку рядків1 :: sayHi ('привіт'); не повернеться "привіт", але повернеться "привіт"?
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
ashkan nasirzadeh

Чому ми не маємо $ це всередині статичної функції? Яка архітектурна логіка цього? Дякую.
Лукас Бустаманте

@LucasBustamante: $thisпосилається на поточний об'єкт. У статичній функції немає поточного об'єкта; функція існує в класі без необхідності або посилання на об'єктний примірник цього класу.
хаос

3

Виклик нестатичних методів статично генерує попередження рівня E_STRICT.


2

У двох словах, ви не маєте об'єкта як $ this у другому випадку, оскільки статичний метод - це функція / метод класу, а не об'єктний екземпляр.


1
статично просто, як ви визначаєте функції класу? немає іншого вигадливого бізнесу? Отже, ви кажете, якби він називався "class_method", а не "статичним", це було б більш смисловим?
ahnbizcad

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.