Определите, был ли статический метод вызван статически или как метод экземпляра - PullRequest
7 голосов
/ 30 марта 2011

В PHP статические методы можно вызывать так, как если бы они были экземплярами:

class A {
    public static function b() {
        echo "foo";
    }
}

$a = new A;

A::b();  //foo
$a->b(); //foo

Есть ли способ определить внутри b(), был ли метод вызван статически или нет?

Я пробовал isset($this), но в обоих случаях он возвращает false, и debug_backtrace(), похоже, показывает, что оба вызова на самом деле являются статическими

array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(57) "test.php"
    ["line"]=>
    int(23)
    ["function"]=>
    string(1) "b"
    ["class"]=>
    string(1) "A"
    ["type"]=>
    string(2) "::"
    ["args"]=>
    array(0) {
    }
  }
}
Foo
array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(57) "test.php"
    ["line"]=>
    int(24)
    ["function"]=>
    string(1) "b"
    ["class"]=>
    string(1) "A"
    ["type"]=>
    string(2) "::"
    ["args"]=>
    array(0) {
    }
  }
}

1 Ответ

3 голосов
/ 30 марта 2011

Трюк isset работает, только если вы не объявили метод явно как static.(Потому что это именно то, что превращает вызов объекта -> в статический вызов.)

Методы все еще можно вызывать через class::method(), если вы не используете модификатор static.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...