__call для существующих методов

BelStudent

целеустремлённый чел
__call для существующих методов

Есть класс с кучей методов, нужно чтобы при вызове каждого метода выполнялся вход в "пре-метод", который бы кое-что менял. Думал с этим справиться __call, но оказалось, что _call вызывается только для несуществующих методов. Как быть? Может есть ещё какой-нибудь магический метод, выполняющий то, что мне нужно? Если нет, то как выкрутиться?
 

zerkms

TDD infected
Команда форума
PHP:
<?php

class a
{
	private function pr()
	{
		echo "i'm private";
	}
	
	public function __call($name, $args)
	{
		echo "i'm __call";
		if (method_exists($this, $name)) {
			return call_user_func_array(array($this, $name), $args);
		}
	}
}

$a = new a();
$a->pr();
 

whirlwind

TDD infected, paranoid
Это тебе аоп нужен. Загадочная штука, скажу я. Скорее всего можно прекрасно обойтись без извратов. Например декоратор без методов сделай.
 

BelStudent

целеустремлённый чел
Автор оригинала: zerkms
PHP:
<?php

class a
{
	private function pr()
	{
		echo "i'm private";
	}
	
	public function __call($name, $args)
	{
		echo "i'm __call";
		if (method_exists($this, $name)) {
			return call_user_func_array(array($this, $name), $args);
		}
	}
}

$a = new a();
$a->pr();
Твой способ не работает
Call to private method a::pr() from context ''
Да и работать наверно не будет:
http://blog.sjinks.pro/php/573-about-call-magic-method/
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
на 5.3 пример zerkms работает
а по той ссылке в коде примеров ошибки

а зачем именно нужен вызов перед обращением к любому методу?
 

BelStudent

целеустремлённый чел
grigori
логирование действий.

-~{}~ 12.11.09 18:16:

Автор оригинала: grigori
на 5.3 пример zerkms работает
а по той ссылке в коде примеров ошибки
А где ошибки, что-то я не заметил. Укажи конкретно место.

-~{}~ 12.11.09 20:30:

Автор оригинала: zerkms
PHP:
<?php

class a
{
	private function pr()
	{
		echo "i'm private";
	}
	
	public function __call($name, $args)
	{
		echo "i'm __call";
		if (method_exists($this, $name)) {
			return call_user_func_array(array($this, $name), $args);
		}
	}
}

$a = new a();
$a->pr();
Проапгрейдил PHP, пример реально работает. Но как быть если метод вызывается из другого метода этого класса, тут уже нужно искать другой подход.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
логирование действий пользователя я лично пишу путем вызова метода ->log() в контроллере

я убежден, что ты придумал неправильный способ решения другой проблемы

-~{}~ 12.11.09 20:10:

PHP:
class A {
        public function call($method, $params)
call() без подчеркиваний, т.е. человек не тестирует примеры
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Krishna
более правильный вариант - писать логи отдельно от вызовов методов или перепроектировать систему
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
хорошо, давай обсудим критерий правильности с точки зрения BelStudent, которую не знаем ни мы, ни он сам
 

Lightning

Трудоголик
Не могу представить себе систему, в которой логируется каждый вызов метода. Кроме того, в логи, имхо, лучше писать что-нибудь более осмысленное, чем просто имя метода и параметры. Задача решается в зависимости от того, что именно нужно логировать. Если логируются действия пользователя в системе, то вполне подойдет метод grigori, имхо. Если логируются какие-либо действия и события самой системы, то можно и в сами методы включить логирование. И кстати, почему ты решил писать лог именно перед вызовом метода? А если метод выполнился с ошибкой?..
 

Krishna

Продался Java
Не могу представить себе систему, в которой логируется каждый вызов метода.
Логгер-Декоратор помимо прочего позволит создать настраиваемый в едином параметре (едином наборе параметров) режим логирования.
 

Lightning

Трудоголик
Krishna
Не факт, что Декоратор в данном случае самое лучшее решение. Смотря, что именно ТС хочет логировать и как.
 

BelStudent

целеустремлённый чел
Автор оригинала: Lightning
Не могу представить себе систему, в которой логируется каждый вызов метода. Кроме того, в логи, имхо, лучше писать что-нибудь более осмысленное, чем просто имя метода и параметры. Задача решается в зависимости от того, что именно нужно логировать. Если логируются действия пользователя в системе, то вполне подойдет метод grigori, имхо. Если логируются какие-либо действия и события самой системы, то можно и в сами методы включить логирование. И кстати, почему ты решил писать лог именно перед вызовом метода? А если метод выполнился с ошибкой?..
Тогда возможно следует сделать чтобы заносилось в лог после выполнения функции. Но суть от этого не меняется, нужно где-то перехватывать выполнение функции. Начал использовать декоратор.
 
Сверху