Метод вызван статически или из объекта?

С.

Продвинутый новичок
Не могу найти нормальный способ определения изнутри, как вызван метод, статическим способом или от сконструированного объекта. Раньше в четверке все было просто isset($this), сейчас это не проходит. Самое простое, что мог придумать: get_class()==get_class($this), но и это не дает 100% гарантии. Я что-то пропускаю?
 

fixxxer

К.О.
Партнер клуба
isset($this) && $this instanceof self

но так делать не надо, это ужасный костыль
 

С.

Продвинутый новичок
$this instanceof self равносильно get_class()==get_class($this) и не дает гарантии, что это именно та среда
PHP:
class C
{
  function f1()
  {
    // Хто я, иде я?
  }
  function f2()
  {
    C::f1();
  }
}

$o= new C()
$o->f1();
$o->f2();
 

fixxxer

К.О.
Партнер клуба
Если тебе еще и такую ситуацию надо различать, у тебя ТОЧНО проблемы с архитектурой.
 

С.

Продвинутый новичок
Ситуация конечно умозрительная, но заинтересовало, (1) неужели нет некостыльного способа определения среды вызова и (2) зачем вообще чужой $this видим в постороннем статическом методе?
 

fixxxer

К.О.
Партнер клуба
(1) некостыльный способ сделать костыль?...
(2) так исторически сложилось, как многое в php
 

С.

Продвинутый новичок
(1) Я спрашиваю, как корректно определить метод вызван статически или инстансически? В чем хромота?
(2) В PHP4 такого не было. Почему это "исторически" сложилось где-то между 5.0 и 5.2?
 

A1x

Новичок
Раньше в четверке все было просто isset($this)
что-то то я сомневаюсь
PHP:
class Foo {

    function bla() {
        Bar::func();
    }
}
в четверке точно так же внутри Bar::func() виден $this вызывающего объекта класса Foo

не знаю как в других языках но вот в перле этот вопрос решается тривиально,
хотя там все ООП - один большой костыль
 

С.

Продвинутый новичок
Да, я погорячился с четверкой. Проверил, действительно также. Но первый вопрос остается.
 

radioheaded

PHP нуб
А поделитесь секретом, зачем это вообще нужно в 5-ке? В 4-ке я еще могу понять худо-бедно. Динамические методы нужно вызывать динамически, статические — статически. Или я что-то упускаю.
 

A1x

Новичок
не тут наоборот, иногда хочется чтобы один и тот же метод делал разные вещи, в зависимости от того вызван ли он как метод класса или как метод объекта
 

radioheaded

PHP нуб
не тут наоборот, иногда хочется чтобы один и тот же метод делал разные вещи, в зависимости от того вызван ли он как метод класса или как метод объекта
Неужели это удобнее двух разных методов, каждый из которых занимается только своим делом?
 

A1x

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

во придумал пример: класс View у коханы имеет метод set для задания переменной конкретного экземпляра
и статический метод set_global для переменной видимой во всех шаблонах.

А так можно было бы

View::set('var', 'xxx'); // задаем глобальную переменную

View::factory('tpl')->set('foo', 'bar'); // задаем переменную экземпляра
 

weregod

unserializer
Не могу найти нормальный способ определения изнутри, как вызван метод, статическим способом или от сконструированного объекта.
Не знаю, как оценить "нормальность", узнать про статичность контекста можно через debug_backtrace() по отсутствию ключа object в строке.
 

С.

Продвинутый новичок
debug_backtrace() я изначально не упомянул, потому что для меня это очевидно не "нормально".
 

fixxxer

К.О.
Партнер клуба
Не знаю, как оценить "нормальность", узнать про статичность контекста можно через debug_backtrace() по отсутствию ключа object в строке.
авотхрен. в приведенном случае оно там будет. из чего явно следует что отличить никак
 
Сверху