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

alexz15

Постоялец
Регистрация
3 Окт 2008
Сообщения
394
Реакции
194
Сорри за название темы, не знал как назвать...

есть 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().
 
Да, будет повторное обращение и повторный вызов file_get_contents()
Пиши через классы... или через global (но я тебе этого не советовал, если что)
 
т.е. сделать так?:

PHP:
function parser($Lang){
    // тут присутствует file_get_contents()
    return $Lang;
}
 
$str = parser($Lang);
 
function show($Lang){
    global $str;
    return $str;
}
 
$str можно и вторым параметром в show передать, без global
PHP:
function show($Lang, $str){
return $str;
}
 
  • Заблокирован
  • #5
Пиши через классы...
Если подробнее, то используй паттерн(шаблон проектирования) 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.: Вродь ничё не напутал, если правильно тебя понял.
 
Вот накатал вариант на "скорую руку"

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_hash, self::$_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');
}

Суть такова... Чтобы не подгружать постоянно файлы с контентом, мы его кидаем в кеш и достаём его если нужно повторно.
Я сделал хеш по имени файла... но можно и по другому.
Это даёт прирост в скорости, но кушает больше памяти.

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