...точнее даже по архитектуре ПХП. есть такой код: Код (Text): function parse($message) { $sm = array("text"=> "text", и еще десяток таких полей); foreach($sm as $key=>$sm_i) { $message = preg_replace($key, $sm_i, $message); } return $message; } Так вот, вопрос - ПХП при каждом вызове функции инициализирует массив или только при первом вызове в течении сеанса? Вроде бы он изнать не знает, что такое сеанс, но в тоже время хочется верить, что он не будет вести себя так глупо
Если он большой, передавай по ссылке, тогда он не будет копироватся в функции и не нужно будет делать return - просто перезапишешь новыми значениями исходный массив - это будет быстрее. И в данном случае лучше и в десятки раз быстрее str_replace.
Psih Для этого надо объяснить что такое ссылка. Для неизучавших С это проблема. Берешь грех на душу. Всех таких как ты надо запирать в отдельном разделе, где они мудохаются с лентяями, которым "помогли" и показали какие они умные. А то потом удивляетесь. отчего это все форумы засраны. аффтору, который чукча-нечитатель, ПРОЧЕСТЬ
antonn А ещё лучше вообще описать что требуется, а то у меня смутное подозрение что тебе не static нужно а что-то другое....
PHP: <?php $REPLACEMENTS = array("text"=> "text", и еще десяток таких полей); function parse ($message) { global $REPLACEMENTS; return preg_replace (array_keys ($REPLACEMENTS), array_values ($REPLACEMENTS), $message); } ?>
ответ на вопрос автора -- локальный массив (как и любая локальная переменная) будет создаваться заново и уничтожаться при каждом вызове функции. чтобы этого не происходило (если уж автора это так напрягает), массив надо определять глобально. если автора напрягает также и то, что массив придётся переопределять при каждом вызове скрипта, то хранить массив придётся в кеше (apc если один сервер и memcache -- если много). а насчёт того, насколько глупо удалять из стэка локальные переменные -- вопрос по теории программирования и у незамутнённого сознания автора, похоже, впереди ещё много открытий. мир, действительно, несовершенен, и стэк, действительно, не бесконечен...
armadillo работающим в асме и дельфи - нет... народ, вы не поняли, я знаю как по другому проектировать все это, мне просто было интересно, а на самом деле оптимизируется ли эта операция или нет, именно для данного примера. Для чукчей-писателей прочесть третий пост. Psih там регулярка, пример вообще сделан для красоты и из вежливости
садитесь, два. Чтобы доступ к данным чужого вызова функции назвать "оптимизацией" - это кем надо быть?
ух ты, а ну-ка, расскажите, за что именно "два"? я послушаю с удовольствием хотелось выпендриться? ну теперь рассказывай, чем так возбудила фраза "работающим в асме и дельфи - нет...". Ведь, конечно, что бы так всколыхнуться, нужно разбираться и в асме, и в дельфи, и в Си, и еще иметь какой то барахлящий телепатор, я послушаю с утроенной силой %)
antonn Короче, в данном случае идиален мой вариант с приёмом параметра по ссылке. Таким образом 2 плюса: 1). Масив не копируется, работа происходит напрямую с массивом по ссылке - экономим память (не создаётся копия масива) и изменяется исходный массив - даже return делать не надо. 2). Вам положить на имя переменных в отличии от вариантов со static и global (камень в огород авторов этих идей - вы привязываетесь к конкретным именам переменных + надо проверять а есть ли они вообще глобально. Темболее функция может использоваться не в одном-двух местах, а во многих. Принцип чёрного ящика господа - учить матчасть, основных принципов и парадигм программирования в PHP никто не отменял).
блин.. пойду убьюсь %) еще раз скажу - мне просто было интересно, просто спортивный интерес, как поступил в данном случае ПХП (именно на низком уровне), он прокеширует после вызова этот массив или каждый раз будет вызывать его инициализацию (выделение памяти, ее заполнение, а после ретурна - освобождение). Дельфи вот кеширует, возможно Си с какими то параметрами компиляции тоже, ПХП ведь не дураки собирали, вот мне и стало интересно - а как там на самом деле ПРОСТО ИНТЕРЕСНО Конкретно для данного случая (объявление массива локально в функции), как обойти я найду способы.
Psih, каким макаром static залезет в глобальную область видимости? Мы просто создадим в конкретной функции конкретный массив регулярок, по которым будет проходиться только внутри этой функции. К чему тут ссылки - непонятно. Это только если у нас встанет задача передать в функцию какую-то локальную переменную и чтоб её не копировать, мы передадим по ссылке.
Clone У него идёт регулярка => данные если ты не заметил, так что при каждом вызове они меняются. antonn Тут просто так скучно бывает, что цепляешься за любое более-менее интересное обсуждение. Попробуй тут с кем нить MySQL NDB Cluser пообсуждать - никто его в глаза не видел... Или Lighttpd с XCache. Первый вообще никто не юзает и хорошо если трогали, ну второй мож и юзают, но там обуждать особо нечего - всё работает.
Psih, ты о чём? Там массив, где ключи - регулярки, значения - строки замены. И этим массивом прогоняется какая-то строка. Возможно, ЧПУ так реализован. И этот массив постоянен на протяжении всей работы программы.
antonn А почему бы не проверить? PHP: <?php function parse($message,$a) { if($a==true) { $sm = array("text"=> "creative", "today"=>"forever"); } Инициализируем массив и заполняем значением, если $a=true foreach($sm as $key=>$sm_i) { $message = str_replace($key, $sm_i, $message); } return $message; } print parse('I write the text, becouse today i have free time',true); //Вызываем функцию, передаем в $a - true echo '<br>'; print parse('I write the text, becouse today i have free time',false); //Вызываем функцию, передаем в $a - false ?> В первом случае, когда $a равно true, мы видим что замена сработала. Во втором случае замена не произошла, мы получили 2 ошибки, потому что массив - $sm - пустой. Значит после return он обнулился (на самом деле вообще уничтоже как функцией unset). Если бы он сохранился, то во втором случае замена бы тоже успещшно произошла.
совершенно неверно. оптимизация того толка, что я имел ввиду, выполняется на низком уровне и никак синтаксически не "ловится". Просто потому, что для синтаксиса оно прозрачно и выполняется внутренними механизмами бинарника. к сожалению оттебажить не могу, дебагер валится сразу после запуска апача