Вызов метода базового класса с переменным числом аргументов

whirlwind

TDD infected, paranoid
Вызов метода базового класса с переменным числом аргументов

Что-то не въеду, как правильно написать...

В базовом класе определен метод, принимающий переменное количество аргументов. В наследнике этот метод переопределяется. В переопределенном методе есть необходимость вызвать оригинальный метод родительского класса. Использую
PHP:
        $callback = array( ??? ,'mlog');
        return call_user_func_array($callback,$argv);
На месте вопроса нельзя ставить $this, т.к. будет бесконечная рекурсия. &parent не работает. Если записывать как
PHP:
        $callback = array( $this,'parent::mlog');
то php естессно ругается на отсутствие метода parent::mlog. Получить родителя из указателя естессно нифига не получается.

Так как же все-таки вызвать нужный метод?
 

whirlwind

TDD infected, paranoid
есть другой вариант вызова функций с переменным числом аргументов?
 

SiMM

Новичок
Указывай там имя родительского класса. Т.е. что-то вроде
PHP:
return call_user_func_array(array('baseclassname','method'),$arguments);
 

whirlwind

TDD infected, paranoid
Спасибо. Только странно как-то, что вместо ссылки передается имя. Очень похоже на вызов статического метода. Но вроде работает, т.к. в базовом используется this и не ругается.
 

SiMM

Новичок
> Очень похоже на вызов статического метода.
А это и есть вызов статического метода ;) Просто $this, если он есть, судя по всему, в PHP передаётся методу в любом случае - действительно статическому методу он не нужен и зла от этого немного, но зато в подобных случаях - это помогает ;)
PS: прошу считать это лишь ИМХО, просто подобное, возможно неверное, представление, упрощает жизнь. Если я не прав - надеюсь, гуру меня поправят :)
 

svetasmirnova

маленький монстрик
>Просто $this, если он есть, судя по всему, в PHP передаётся методу в любом случае
похоже, нет:
PHP:
class A
{
	 public function foo()
	 {
		 var_dump($this);
	 }
	 
	 public static function bar()
	 {
		 var_dump($this);
	 }
}
class B extends A
{
	public function foo()
	{
		var_dump($this);
		call_user_func(array('A', 'foo'));
		call_user_func(array('A', 'bar'));
	}
}

$b = new B;
$b->foo();
Судя по всему, это всё-таки вызов динамического метода.
Спасибо: не знала.
 

whirlwind

TDD infected, paranoid
> Просто $this, если он есть, судя по всему, в PHP передаётся методу в любом случае

Видимо, нет, т.к. нижеследующее не работает
PHP:
        $callback = 'MLog::mlog';

        $callback = array(&$this,'MLog::mlog');
Скорее всего this передается только в случае если первый аргумент - массив aka ссылка на класс + экземпляр.
 

tony2001

TeaM PHPClub
svetasmirnova
Код:
object(B)#1 (0) {
}
object(B)#1 (0) {
}

Notice: Undefined variable: this in /www/index.php on line 12
NULL
?
ч. и т.д.
 

svetasmirnova

маленький монстрик
tony2001
Да ничего: иллюстрация решения SiMM. То есть того, что метод вызывается именно как динамический. Или так быть не должно?
 

tony2001

TeaM PHPClub
бррр.
почему как динамический?
где?
ни одного object(A) я не вижу.
 

svetasmirnova

маленький монстрик
Но если мы сделаем так:
PHP:
class A
{
	 public function foo()
	 {
		 var_dump($this);
	 }
	 
}
class B extends A
{
	public function foo()
	{
		var_dump($this);
		parent::foo();
	}
}

$b = new B;
$b->foo();
parent::foo(); - это вызов динамического или статического метода?

-~{}~ 24.10.05 15:39:

Мы же тоже ни одного object(A) не видим
 

tony2001

TeaM PHPClub
конечно, статического.
$this там есть только для совместимости с PHP4 и только если вызываемый метод не объявлен как static.
 

svetasmirnova

маленький монстрик
ОК, статического.

>$this там есть только для совместимости с PHP
Т.е. это поведение в будущем может измениться? А как же конструктор? (parent::__construct()) Да и вообще возможность вызвать родительский метод из дочернего дело полезное.
 

tony2001

TeaM PHPClub
>Т.е. это поведение в будущем может измениться
не знаю.

>Да и вообще возможность вызвать родительский метод из дочернего дело полезное.
вызывайте - кто мешает?
 

Screjet

Новичок
$this там есть только для совместимости с PHP4 и только если вызываемый метод не объявлен как static.
эта фитча только ПХП5 (!)
(5.0.5:OK, 4.4.0: undefined this)

есть $this только если вызов родительского метода.

-~{}~ 26.10.05 06:24:

тфу.. пример забыл
PHP:
class A
{
     function foo()
     {
         var_dump($this);
     }

}

class B extends A
{
    function bar()
    {
        var_dump($this);
    }

    function baz()
    {
        call_user_func( array('A', 'foo') );
        call_user_func( array('B', 'bar') );
    }
}

$b = new B;
$b->baz();
-~{}~ 26.10.05 07:16:

есть $this только если вызов родительского метода
Сорри: Или собственного метода.

Похоже все дело в типе callback. Только в ПХП5 статический callback видит контекст объекта, если таковой имеется.
 
Сверху