Використання $ this всередині статичної функції не вдається


77

У мене є такий метод, в якому я хочу використовувати $ this, але все, що я отримую: Фатальна помилка: Використання $ this, коли воно не знаходиться в контексті об'єкта.

Як я можу змусити це працювати?

public static function userNameAvailibility()
{
     $result = $this->getsomthin();
}

Відповіді:


137

Це правильний спосіб

public static function userNameAvailibility()
{
     $result = self::getsomthin();
}

Використовуйте self::замість $this->для статичних методів .

Дивіться: Підручник із статичних методів PHP для отримання додаткової інформації :)


1
правда, я збирався розмістити цю відповідь.
Gaurav Sharma

13
Ви також повинні пам’ятати, що метод getomthin () також повинен бути статичним - Ви не можете викликати нестатичний всередині статичного методу.
thorinkor

7
@Sarfraz, чи не повинно це бути static::замість self::?
Pacerier

Чи є спосіб зробити щось подібне до цього в C / C ++?
thnkwthprtls

14

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

Редагувати : За визначенням, статичні методи можна викликати без будь-якого екземпляра об'єкта, і, отже, немає сенсового використання $thisвсередині статичного методу.


2
Це повинно бути, коли ви намагаєтесь призначити статичну змінну екземпляру. Це не можливо?
Джом,

self::staticMethod()або $self = new self();та$self->nonStaticMethod();
xavier bs

5

Тільки статичні функції можна викликати всередині статичної функції за допомогою self :: якщо ваш клас містить нестатичну функцію, яку ви хочете використовувати, тоді ви можете оголосити екземпляр того самого класу та використовувати його.

<?php
class some_class{
function nonStatic() {
    //.....  Some code ....   
    }
 Static function isStatic(){
    $someClassObject = new some_class;
    $someClassObject->nonStatic();
    } 
}
?>

3

Доступ thisзвертається до поточного екземпляра класу. Оскільки статичні методи не запускаються з екземпляра, використання thisзаборонено. Тому потрібно викликати метод безпосередньо тут. Статичний метод не може отримати доступ до нічого в області дії екземпляра, але може отримати доступ до всього, що знаходиться в області класу за межами області екземпляра.


1

Шкода, що PHP не виявляє достатньо описової помилки. Ви не можете використовувати $ this-> всередині статичної функції, а скористатися self :: якщо вам потрібно викликати функцію всередині того ж класу


1

Ось приклад того, що відбувається, коли метод класу викликається неправильно. Ви побачите кілька попереджень під час виконання цього коду, але він спрацює і надрукує: "Я A: друкую B властивість". (Виконано в php5.6)

class A {
    public function aMethod() {
        echo "I'm A: ";
        echo "printing " . $this->property;
    }
}

class B {
    public $property = "B property";

    public function bMethod() {
        A::aMethod();
    }
}

$b = new B();
$b->bMethod();

Здається, що змінна $ this, використана в методі, який називається статичним методом, вказує на екземпляр класу "викликає". У наведеному вище прикладі є властивість $ this->, що використовується в класі A, яка вказує на властивість B.

РЕДАГУВАТИ:

Псевдозмінна $ this доступна, коли метод викликається з контексту об'єкта. $ це посилання на викличний об'єкт ( як правило, на об'єкт, якому належить метод, але, можливо, на інший об'єкт, якщо метод викликається статично з контексту вторинного об'єкта ). PHP> Основи


1

У статичному методі властивості стосуються класу, а не об’єкта. Ось чому доступ до статичних методів або функцій можливий без створення об’єкта. $ це відноситься до об'єкта, створеного з класу, але $ self відноситься лише до того самого класу.

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