$needed_object = ObjectsFactory->QueryObject($class_id);

terex

Guest
$needed_object = ObjectsFactory>QueryObject($class_id);

Хочется создавать и возвращать объект указанного класса. Можно ли сделать это как-нибудь иначе (принципиально иначе), нежели
PHP:
class ObjectsFactory() {
  ...
  function QueryObject ($class_id) {

    if($class_id == CLASS_FOO) $ret = new Foo();
    elseif($class_id == CLASS_BAR) $ret = new Bar();
    ...
    else $ret = false;

    return $ret;
  }
  ...
}
Дело в том, что при таком подходе добавление поддержки нового класса в ObjectFactory невозможно без дописывания кода. А это плохо.
В иделе хочется получить что-нибудь похожее на
PHP:
function QueryObject ($class_name) {
  if(class_exists($class_name)) $ret = new $class_name;
  else  $ret = false;

  return $ret;
}
 

Линк

Guest
не $ret = new $class_name а $ret = new $class_name()

вы будете смеяцца, но это работает
PHP:
<?
class obj
{
	function test()
	{
		echo 'A';
	}

}

$boo="obj";
$a=new $boo();

$a->test();
?>
обожаю php)

кто нить предложит что нить покрасивее?
 

tony2001

TeaM PHPClub
Линк
>не $ret = new $class_name а $ret = new $class_name()
и в чем разница?

>вы будете смеяцца, но это работает
гм..
это работает со времен царя Гороха.

terex
>В иделе хочется получить что-нибудь похожее на
и что мешает получить идеал?
 

Линк

Guest
tony2001, и правда
просто когда то не работало без скобок.. в каких то версиях вроде. но я могу ошибаться.

Выходит что terex сам себе ответил
 

terex

Guest
%) а что поделать, мы к вам от сиплюсплюсов и ассемблеров :)

Мда, жизнь иногда оказывается гораздо проще, чем мы её себе представляем.

/*
Сижу вот теперь и размышляю, почему не догадался испытать идеальный вариант :) Прихожу к выводу, что осваивая php после длительного периода низкоуровнего программирования (asm, c) сама возможность такой поразительной халявы отвергалась ещё подсознанием, неговоря уж о сознании и самих извилинах :)
*/

Всем спасибо, господа :)
 

kvn

programmer
PHP:
    function &factory($type)
    {
        @include_once("DB/${type}.php");

        $classname = "DB_${type}";

        if (!class_exists($classname)) {
            return PEAR::raiseError(null, DB_ERROR_NOT_FOUND,
                                    null, null, null, 'DB_Error', true);
        }

        @$obj =& new $classname;

        return $obj;
    }
cut from: PEAR/DB.php
http://cvs.php.net/co.php/pear/DB/DB.php?r=1.58
 
Сверху