Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > return и include


Автор: zibox86 20.5.2010, 19:10
Всем привет!

Нужна помощь, есть класс:

Код

class Application extends Main {
    var $ApplicationName;
    var $ApplicationPath;
    
    var $ApplicationTemplateName;
    var $ApplicationTemplatePath;
    
    var $ApplicationProperty;
    
    var $ComponentMessages;
    
    public function Component($name, $property = false){
        
        $this->ApplicationName = trim($name);
        $this->ApplicationProperty = $property;
        
        if ($this->getApplicationInfo()){        
            $this->init($this->ApplicationProperty,$this->ComponentMessages);
        }
        else{
            return false;
        }
    }

    . . . . . . . . . . . . . . . . . . . . .

    private function init($property, $message){
        include_once $this->ApplicationPath;
    }
              
    . . . . . . . . . . . . . . . . . . . . .

    public function __IncludeTemplate(){
        return include ($this->ApplicationTemplatePath);
    }
}


Так вот, в init() инклудится тело компонента в конце выполнения которого вызывается __IncludeTemplate(). В которой подключается шаблон компонента.

Но шаблон не доступен из Init().

Какие компромиссы предложите?


Может не понятно описал - спрашивайте!

Автор: ksnk 20.5.2010, 19:43
Цитата(zibox86 @  20.5.2010,  19:10 Найти цитируемый пост)
Но шаблон не доступен из Init().

не догоняю что-то 
xxx.php
Код

<?php
echo 'one<br>';
include $this->__IncludeTemplate();
?>

xxx2.php
Код

<?php
echo 'two<br>';
?>

собственно файл
Код

class Application  {
     var $ApplicationPath='xxx.php';
     var $ApplicationTemplatePath='xxx2.php';
    

    function init($property='', $message=''){
        include_once $this->ApplicationPath;
    }
              
    function __IncludeTemplate(){
        include $this->ApplicationTemplatePath;
    }
};
echo 'before<br>';

$x=new Application();
$x->init();
$x->init();
$x->init();
echo ' after!';


выводится 
Код

before
one
two
after!

Вроде именно так, как доктор прописал...

Автор: zibox86 20.5.2010, 20:08
Для наглядности заменил include на содержание фалов

Код

class Application extends Main {
    var $ApplicationName;
    var $ApplicationPath;
    
    var $ApplicationTemplateName;
    var $ApplicationTemplatePath;
    
    var $ApplicationProperty;
    
    var $ComponentMessages;
    
    public function Component($name, $property = false){
        
        $this->ApplicationName = trim($name);
        $this->ApplicationProperty = $property;
        
        if ($this->getApplicationInfo()){        
            $this->init($this->ApplicationProperty,$this->ComponentMessages);
        }
        else{
            return false;
        }
    }

    . . . . . . . . . . . . . . . . . . . . .

    private function init($property, $message){

       defined("SECURITY") or Main::ShowError("Не санкционированный доступ");
       global $Mysql,$Security;

       if (!$property['TYPE_MENU']){
            parent::ShowError("Не указан тип меню");
            return false;
       }

       $Mysql->GetQuerySql("select * from `menu` where `type_menu`={$property['TYPE_MENU']} order by `sort`");

       if($Result = $Mysql->GetFetch()){
    
            $Result = CreateArrayMenu($Result);
            $this->__IncludeTemplate();
       }
    }
              
    . . . . . . . . . . . . . . . . . . . . .

    public function __IncludeTemplate(){
       <div class="menu">
        <?if($Result):?>
            <ul>
            <?foreach ($Result as $Menu):?>
             <li class="item">
                 <a href="<?=$Menu['link']?>"><?=$Menu['name']?></a>
                 <?if (is_array($Menu['parent'])):?>
                     <ul>
                         <?getParent($Menu['parent']);?>
                     </ul>
                 <?endif;?>
             </li>
            <?endforeach;?>
         </ul>
        <?endif;?>
      </div>
    }
}

Автор: zibox86 21.5.2010, 00:04
Ну, что нет знатаков!?

Автор: skyboy 21.5.2010, 10:19
т.е. ты ожидаешь, что переменная $Result, объявленная в методе init() станет автоматически доступна в методе __IncludeTemplate()?

Автор: zibox86 21.5.2010, 13:07
skyboy, Можно и так сказать.

Автор: skyboy 21.5.2010, 13:47
такого не будет.
сохраняй в поле объекта и во втором методе обращайся уже $this->someVariable

Автор: NewDima 21.5.2010, 15:54
Код

$this->__IncludeTemplate($Result);
...
public function __IncludeTemplate($Result){

так нельзя чтоль?

Автор: skyboy 21.5.2010, 16:16
 smile а, точно!

Автор: zibox86 21.5.2010, 16:16
NewDima,  $Result может и не быть или будет называть по другому.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)