Повторный вызов функции. Память

Тема в разделе "Как сделать...", создана пользователем alexz15, 20 июл 2012.

  1. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    191
    Сорри за название темы, не знал как назвать...

    есть 1 функция:
    PHP:
    function parser($Lang){
        
    // тут присутствует file_get_contents()
        
    return $Lang;
    }
    2 функция:
    PHP:
    function show($Lang){
        
    $str parser($Lang);
        return 
    $str;
    }
    вопрос: если несколько раз на странице вызывать 2-ю функцию show(), то будет ли заново обращение к 1-й функции parser() или данные, полученные при первом обращении к ней, будут браться уже из памяти?
    мне нужно, чтобы было меньше обращений к функции file_get_contents() из parser().
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    Да, будет повторное обращение и повторный вызов file_get_contents()
    Пиши через классы... или через global (но я тебе этого не советовал, если что)
     
    alexz15 нравится это.
  3. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    191
    т.е. сделать так?:

    PHP:
    function parser($Lang){
        
    // тут присутствует file_get_contents()
        
    return $Lang;
    }
     
    $str parser($Lang);
     
    function 
    show($Lang){
        global 
    $str;
        return 
    $str;
    }
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    $str можно и вторым параметром в show передать, без global
    PHP:
    function show($Lang$str){
    return 
    $str;
    }
     
     
    alexz15 нравится это.
  5. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Если подробнее, то используй паттерн(шаблон проектирования) Singleton, который создан как раз для решения твоей проблемы. Вот пример реализации
    PHP:
    <?php
    class Singleton {
        protected static 
    $instance;  // object instance
        
    private function __construct(){ /* ... @return Singleton */ }  // Защищаем от создания через new Singleton
        
    private function __clone()    { /* ... @return Singleton */ }  // Защищаем от создания через клонирование
        
    private function __wakeup()  { /* ... @return Singleton */ }  // Защищаем от создания через unserialize
        
    public static function getInstance() {    // Возвращает единственный экземпляр класса. @return Singleton
            
    if ( is_null(self::$instance) ) {
                
    self::$instance = new Singleton;
            }
            return 
    self::$instance;
        }
        public function 
    doAction() { /* ... */ }
    }
    Singleton::getInstance()->doAction(); // Применение
    ?>
    конкретно в твоём случае это должно выглядеть примерно так
    PHP:
    <?php
     
    /**
    * @author Extalionez
    * @copyright 2012
    */
     
    class Singleton {
        protected static 
    $instance;  // object instance
        
    private function __construct(){ /* ... @return Singleton */ }  // Защищаем от создания через new Singleton
        
    private function __clone()    { /* ... @return Singleton */ }  // Защищаем от создания через клонирование
        
    private function __wakeup()  { /* ... @return Singleton */ }  // Защищаем от создания через unserialize
        
    public static function getInstance() {    // Возвращает единственный экземпляр класса. @return Singleton
            
    if ( is_null(self::$instance) ) {
                
    self::$instance = new Singleton;
            }
            return 
    self::$instance;
        }
        public function 
    parser($Lang) { /* тут присутствует file_get_contents() */ return $Lang;}
    }
     
    function 
    show($Lang){
        
    $str Singleton::getInstance()->parser($Lang);
        return 
    $str;
    }
     
    ?>

    P.S.: Вродь ничё не напутал, если правильно тебя понял.
     
    alexz15 нравится это.
  6. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Вот накатал вариант на "скорую руку"

    PHP:
      final class Parser {
     
          private static 
    $_cache_srtings;
         
          private static function 
    _load_lang_file($lang)
          {
                
    /* Получам хеш имени файла */
                
    $_file_name    $lang '-что-то.txt';
                
    $_file_md5_hash md5($_file_name);
               
                
    /* проверяем есть в кеше или нет */
                
    if( array_key_exists($_file_md5_hashself::$_cache_srtings) ) {
                  return 
    self::$_cache_srtings$_file_md5_hash ];
                }
               
                
    /* если не подгружали ещё в кеш */
                
    self::$_cache_srtings$_file_md5_hash ] = file_get_contents$_file_name );
               
              return 
    self::$_cache_srtings$_file_md5_hash ];
          }
     
          public static function 
    parse($lang)
          {
                
    $_str self::_load_lang_file($lang);
               
                
    /*
                    Что-то делаем
                */
               
              
    return $_str;
          }
      }
    Далее пользуем как хотим...

    Так:
    PHP:
    echo Parser::parse('rus');
    Или так:

    PHP:
    function show()
    {
        
    $aaa Parser::parse('rus');
    }
    Суть такова... Чтобы не подгружать постоянно файлы с контентом, мы его кидаем в кеш и достаём его если нужно повторно.
    Я сделал хеш по имени файла... но можно и по другому.
    Это даёт прирост в скорости, но кушает больше памяти.

    Можно конечно развить тему, но думаю дальше справитесь сами.
     
  7. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Если с глобалом писать, то получится вот так:
    Код:
    function parser($Lang){
        // тут присутствует file_get_contents()
        return $Lang;
    }
     
    $str = parser($Lang);
     
    function show($Lang){
        global $str;
       
    }
    Тогда Вы будете обращаться только к переменной $str. Если Вам только считывать данные из $str, то можно передавать вторым параметром, как советовали выше. Если же Вам необходимо ещё изменять содержимое переменной, то можно воспользоваться global. Но лучше, естественно, классы. Тем более, что пример привели.