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

Лысый

Новичок
как грамотно спроектировать вызов статичных методов наследуемого класса

ситуация
есть базовый класс Класс
у него есть статичный метод Метод
вызываю Класс::Метод
предпалагается, что в конретной реализации будут использоваться наследники Класса
если в потомке переопределят Метод, то вызов Класс::Метод будет вызывать метод базовый, а не наследованый - ошибка
если бы речь шла про обычнй метод, а не статичный, я бы использовал какой-нибудь класс-фабрику объектов и всё
а как быть со статичными методами? ведь при вызове надо прямо указывать имя класса, а оно не известно?
 

Лысый

Новичок
это изнутри
а наружи?

-~{}~ 22.08.06 16:28:

а! ты предлагаешь какой нить метод написать который бы дёргал актальный Метод?
function CallMethod
{
self::method();
}
но блин
но то статичный метод и статичный, чтоб не заводя объект его вызывать
 

.des.

Поставил пиво кому надо ;-)
Как может быть неизвестно имя класса статичный метод которого Вы хотите вызвать?
Я даже представить себе такую ситуацию не могу ;)
 

john.brown

просто кулибин
А какой смысл в наследнике переопоеделять статический метод? К тому же, в процессе имя класса должно стать известным, иначе как ты к нему обратишся? Так и вызывай так:

$string = $classname.'::a_static_function();';
eval($string);
 

Лысый

Новичок
а это корретно? я об этом думал, ковырял ман на эту тему - не нашёл
 

.des.

Поставил пиво кому надо ;-)
корректно, но прежде, чем использовать eval надо понимать для чего.
 

Лысый

Новичок
я даже знаю круче пример

вот это работает

class mc
{
public $var;
public function __construct()
{
$this->var = 'ECHO';
echo $this->var;
}
}

$str = 'mc';
$obj = new $str;


это корректно?
 

StUV

Rotaredom
Лысый
язык дает программисту средства
разумное применение этих средств, дающее прозрачный для других программистов, расширяемый, поддерживаемый код, всегда корректно
 

Лысый

Новичок
а не пропадёт ли эта фича в след версиях? я просто ни в одном ХауТу ни в статьях ен видел рекомендаций таким пользоваться
 

Crazy

Developer
Re: как грамотно спроектировать вызов статичных методов наследуемого класса

Автор оригинала: Лысый
ведь при вызове надо прямо указывать имя класса, а оно не известно?
Если человек оверрайдит статические методы, то это первый признак того, что ему нужно сделать паузу, отдохнуть и задуматься о смысле жизни.

Если человек находится в здравом уме и твердой памяти, то оверрайдить статические методы он не станет (разве что под угрозой страшных пыток). Соответственно, проблема снимается сама собой.

P.S. До сих пор я думал, что единственный язык, где действительно работает override для методов класса -- Object Pascal. Но и там, я уверен, если не вылечили, то скоро вылечат.
 

Лысый

Новичок
Автор оригинала: john.brown
Какая фича? eval() что ли? Это вряд ли... Пользуй смело :D
$str = 'mc';
$obj = new $str;

-~{}~ 23.08.06 10:45:

Crazy

а чего принципально плохого в пееропределение статических методов?
 

Crazy

Developer
Автор оригинала: Лысый
а чего принципально плохого в пееропределение статических методов?
То, что при этом возникает вероятность путаницы (легко написать Foo::Quixx вместо Bar::Quixx), но не создается никаких новых удобств и никакой новой функциональности.
 

ilih

Новичок
Автор оригинала: john.brown
А какой смысл в наследнике переопоеделять статический метод? К тому же, в процессе имя класса должно стать известным, иначе как ты к нему обратишся? Так и вызывай так:

$string = $classname.'::a_static_function();';
eval($string);
http://ru.php.net/call_user_func

PHP:
<?php
class myclass {
  function say_hello() 
  {
   echo "Hello!\n";
  }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
?>
 

texrdcom

Новичок
во даете
PHP:
<?php
class test
{
	static function bla()
	{
		echo 'test';
	}
}

class test2 extends test 
{
	static function bla()
	{
		parent::bla();
	}
}

test2::bla();
 

Лысый

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

texrdcom

Новичок
Лысый
а надо на оборот ?

-~{}~ 25.08.06 11:54:

Лысый
Если тебе надо застроховаться от ошибок
чтоб в наследуемом классе не преопределили функцию
базоваго то можно сделать еще проще добавить слово
PHP:
final  static function bla() 
    { 
        echo 'test'; 
    }
Иначе подумай на измении архитектуры данных классов
 
Сверху