Перехват вызова статического метода PHP 5.2

Major

Новичок
Перехват вызова статического метода PHP 5.2

Я вообще люблю играть с пхп и вот недавно тут наткнулся на такую особенность. Многие слышали что в PHP 5.3 добавлена функция __callStatic() для перехвата статических методов. Но вот в пхп 5.2 так же можно осуществить перехват, но с ограничениями.

PHP:
class F
{
     private static $_Instance;

     private function __construct() {}

     public static function I()
     {
          self::$_Instance instanceof self
               or self::$_Instance = new self;
          return self::$_Instance;
     }

	public function inc($file)
	{
		return include $file;
	}

	public function __call($name, $args)
	{
		var_dump( $name, $args );
	}
}

F::I()->inc('test.php');
Теперь в test.php можно писать так:

PHP:
F::undefined_foo();

Вызов данного статического метода будет перехвачен как нестатического, что очень забавно. Это, конечно, относится к разряду "ХАКи", но все же забавная тема.

Незнаю, фича это или нет, но для меня лично это была действительно забавная фича, которая мне по началу мешала, так как я думал что законы физики поменяли, когда я замудрил код так, что там явно небыло видно как происходит вызов. Я не понял почему на вызов не вываливаются фатал ерроры =) Конечно это скорее баг, чем фича, но все же это фича =)

Более того, если сделать вызов существующего метода нестатического, тон тоже будет вызван, при этом никакой стрикт-мод вамне помаешает и не сгенерит нотисы. А в методе так же будет работать $this.

ВЕРДИКТ. Внутри методов можно делать вызовы нестатических методов данного класса через оператор статического доступа. Это позволяет запутать кодера, а так же позволяет сократить запись и сделать ее более красивой =) Вот как-то так...
 

fixxxer

К.О.
Партнер клуба
вообще ключевое слово static делает только одно - отменяет объявление переменной $this со всеми вытекающими.

а для перехвата статических вызовов в php 5.3 есть гораздо более элегантный способ - __callStatic().
 

флоппик

promotor fidei
Команда форума
Партнер клуба
вообще ключевое слово static делает только одно - отменяет объявление переменной $this со всеми вытекающими.
Скорость обращения к статическим данным малость повыше будет. И не требует создания для этого экземпляра.
 
Сверху