Method Overloading (php4)

Altex

Новичок
Method Overloading (php4)

PHP:
    class Tpl
    {
    	var $mSmarty;
    
		function Tpl()
		{
			overload(__CLASS__);

		    require_once dirname(__FILE__).'/lib/smarty/Smarty.class.php';
			$this->mSmarty =& new Smarty;
			
			$this->mSmarty->template_dir = dirname(__FILE__)."/tpl";
    		$this->mSmarty->compile_dir = dirname(__FILE__)."/tpl_c";
		}
   	
		function __call($method, $args)
		{
			return call_user_func_array(array($this->mSmarty,$method),$args);
		}

    }
  
	$tpl =& new Tpl();

   $tpl->assign('pl','');
   $tpl->display('template.tpl');
На выходе
Код:
Warning: Call to undefined method tpl::assign() in <skip>test.php on line 27
и показывается шаблон template.tpl

Почему метод display вызывается, а assign нет?
 

Profic

just Profic (PHP5 BetaTeam)
Угу. Это из [m]ref.overload[/m]. Я когда-то игрался с этой штукой, но после непонятных глюков забил на него, тем более php5 с нормальной поддержкой этого дела маячил на горизонте.
 

white phoenix

Новичок
Profic
:) да.. и я в 4.x.x мучался долго с глючным ООП, причем глюки были очень смешные, особенно с клонированием, невольно вспомнил комедию где ученые сделали машину клонирования предметов и она заглючила когда туда попала овца.
 

Frol

Новичок
white phoenix
глючный ООП -- это что?
глюки с клонированием -- это вообще что такое?

может, меньше курить надо?
 

white phoenix

Новичок
Frol
курить надо меньше программерам пхп. во-первых.. $a = new myclass; и создавалось две копии обьекта, как впоследствие выяснилось нужно было делать &new. Во-вторых при передаче обьекта по ссылке копировался весь обьект. В общем если хочешь раскурить тему - читай, ведь сто раз писали.
 

Frol

Новичок
white phoenix
спасибо, я курю эту тему дольше тебя.
и я тебе могу сказать, что если язык работает так, как он должен -- это не глюк.
 

Altex

Новичок
PHP:
    class Smarty
    {
	function a1($a, $b)
	{
	    echo $a,$b;
	    return NULL;
	}
	
	function a2($a, $b)
	{
	    echo $a,$b;
	    return false;
	}
	
	function a3($a, $b)
	{
	    echo $a,$b;
	    return true;
	}

	function b1($a)
	{
	    echo $a;
	    return NULL;
	}
	
	function b2($a)
	{
	    echo $a;
	    return false;
	}

	function b3($a)
	{
	    echo $a;
	    return true;
	}
    }


    class Tpl
    {
        var $mSmarty;
    
        function Tpl()
        {

            $this->mSmarty =& new Smarty;
        }
       
        function __call($method, $args)
        {
            return call_user_func_array(array($this->mSmarty,$method),$args);
        }

    }
  
    overload('Tpl');
    $tpl =& new Tpl();

   $tpl->a1('A1 ','NULL');
   $tpl->a2('A2 ','FALSE');
   $tpl->a3('A3 ','TRUE');

   $tpl->b1('B1 NULL');
   $tpl->b2('B2 FALSE');
   $tpl->b3('B3 TRUE');
RESULT
Код:
A1 NULL
Warning: Call to undefined method tpl::a1() in <skip>index.php on line 66
A2 FALSE
Warning: Call to undefined method tpl::a2() in <skip>index.php on line 67
A3 TRUEB1 NULL
Warning: Call to undefined method tpl::b1() in <skip>index.php on line 70
B2 FALSE
Warning: Call to undefined method tpl::b2() in <skip>index.php on line 71
B3 TRUE
 

Gorath

Новичок
То, что это - баг, очевидно.
Только вот интересно, если багрепорт написать, обратит ли кто-нибудь внимание, расширение-то Experimental+Deprecated.. ну почти deprecated..
 

Frol

Новичок
white phoenix
тоесть, ты не можешь ответить на мои вопросы?
 

Altex

Новичок
Парни, ещё вот что


PHP:
function __call($method, $args, &$ret)
{
    if (method_exists($this->mSmarty,$method))
    {
        $ret=call_user_func_array(array($this->mSmarty,$method),$args);
        return true;
    }
    else
    {
        return false;
    }
}
Мда.
 

Frol

Новичок
Вот так работает, но почему бы разработчикам не сделать было третьим параметром функции __call параметр для возврата результата?
а ты пробывал?
судя по комментариям, он там есть.

-~{}~ 19.11.05 17:18:

дурная привычка менять пост.
 

Altex

Новичок
Надо было действительно проверить сразу. А ещё лучше это не в комментах было писать, а в мануале. Если кто найдет, киньте ссылку пожалуйста?
 
Сверху