Понятия не имею. Это могут быть абсолютно разные вещи Для меня важен как минимум ляп в логике работы getc/getcc Возможно там есть что-то еще, но я не копал. flush вообще детально не смотрел из-за отвращения к vars_dump и связанной с этим логикой.
Правда, getcc лишний. Но я его ввел только потому, что подумал, что после extrcat в методе getc и выполнения объекты в _vars так и останутся ссылками. Еще вместо второго вызова vars_dump в методе flush можно исползовать ранее созданую переменную $vardump. В конце метода flsuh echo $this; обязательно, чтобы метод flush во всем (кроме кэширования) был аналогичен __toString.
А чем принципиально отличается от хэширования переменных? На хэширование уходит больше времени, чем на сравнение длиных строк.
А причина вовсе не в хешировании. Причина в том, что кто-то создал много разных ненужных методов в результате чего появляется путаница в вызовах и этот абсолютно ненужный неудобоваримый метод(vars_dump) кеширование надо было добавлять к вот этому. http://www.php.ru/forum/viewtopic.php?p=201089#201089
Сериализация объекта в 2 раза быстрее создания и сериализации дампа переменных. Зато десериализация этого объекта в 3 раза медленнее десериализации массива, + каждый раз время потребуется на выполнение (если выполнять перед сериализацией, то объекты потом при сравнении не совпадут, в исходном _content = null), а в массиве он уже готовый. Десериализация нужна будет чаще сериализации, поэтому метод вовсе не лишний. PHP: <?php class ts { private $_vars = array(); function __set($k, $v) { $this -> _vars[$k] = $v; } function vars_dump() { $vdump = array(); foreach ($this -> _vars as $k => $v) { if (is_object($v)) { $vdump[$k] = $v -> vars_dump(); } else { $vdump[$k] = $v; } } return $vdump; } } $obj = new ts; $obj -> text = 'Preved!'; for ($i = 0; $i < 100; $i++) { $otemp = new ts; $otemp -> n = $i; $obj -> $i = $otemp; } echo 'Object:<br>'; $start = microtime(1); for ($i = 0; $i < 10000; $i++) { $ser = serialize($obj); } echo microtime(1) - $start,'<br>'; $start = microtime(1); for ($i = 0; $i < 10000; $i++) { $user = unserialize($ser); } echo microtime(1) - $start,'<br>'; echo 'Array:<br>'; $start = microtime(1); for ($i = 0; $i < 10000; $i++) { $ser = serialize($obj -> vars_dump()); } echo microtime(1) - $start,'<br>'; $start = microtime(1); for ($i = 0; $i < 10000; $i++) { $user = unserialize($ser); } echo microtime(1) - $start,'<br>'; Код (Text): Object: 2.29684710503 3.93136286736 Array: 5.78200387955 1.15568709373
В угоду гибкости и удобству написания приносится в жертву прозрачная структурированная архитектура приложения. По этой же причине я не приемлю eval() ни под каким соусом.
Amian Это все же "динамический" язык Где-то у меня был спор на Хабре с LaggyLuke по поводу геттеров/сеттеров. Было там кое-что и про остальную магию... Основная проблема, - которая останавливает лично меня от массового использования "магии", - это отвратительная поддержка IDE в этом направлении. Я хочу меньше писать, но чтобы больше делалось.
topas http://www.php.ru/forum/viewtopic.php?t ... =30#211313 Там главное - скорость, тут почему-то "при чем тут скорость?". На первый взгляд кажется, что vars_dump торомзит работу. Или имелось ввиду другое? Но я же не телепат )) И к тому же, где это я "гоню"? Для меня "гнать" означает "врать", вот я привел тестовый скрипт, че там таймер врет? Или имелось ввиду другое? Короче, непонимание слушателя - это фэйл оратора ((
[vs], каково это быть мартышкой-говнокодером? Какие у тебя ощущения? Конечно ты не телепат - ты идиот. Читай еще раз: и медитируй до просветления.
[vs] Ты хочешь заплатить мне за полноценный code-review своего творчества? Нет? Не хочешь? Тогда сделай для начала то, что я от тебя требовал с самого начала - приведи код в нормальный удобочитаемый вид.
Я уже писал, что можно выкинуть getcc и повторно использовать $vardump PHP: <?php class view { const CACHE_SWITCH = 1; const CACHE_DIR = './cache'; private $cfname = null; private $_vars = array(); private $_path = null; protected $_content = null; public function __construct($_path) { $this -> _path = $_path; $this -> cfname = self::CACHE_DIR.'/'.md5($this -> _path); } public function cName($name) { $this -> cfname = self::CACHE_DIR.'/'.md5($name); } public function __set($var, $val) { $this -> _vars[$var] = $val; } public function __get($var) { if (isset($this -> $var)) { return $this -> $var; } return $this -> _vars[$var]; } public function flush() { if (self::CACHE_SWITCH == 1) { $cfname = $this -> cfname.'.cache'; $cached = null; $vardump = $this -> vars_dump(); if (file_exists($cfname)) { $cached = unserialize(file_get_contents($cfname)); } if ($vardump == $cached[0]) { $this -> _content = $cached[1]; } else { $cache = array($vardump, $this -> getc()); file_put_contents($cfname, serialize(&$cache)); } } echo $this -> getc(); } private function getc() { if ($this -> _content == null) { extract($this -> _vars); ob_start(); include($this -> _path); $this -> _content = ob_get_clean(); } return $this -> _content; } private function vars_dump() { $vdump = array(0 => $this -> _path, 1 => array()); foreach ($this -> _vars as $name => $val) { if (is_object($val)) { $vdump[1][$name] = $val -> vars_dump(); } else { $vdump[1][$name] = $val; } } return $vdump; } public function __toString() { return $this -> getc(); } }
Да, я вижу, что __toString состоит только из вызова одного метода, но если ты еще к этому придерешься то это будет ппц.
[vs] У меня нервы не железные. Назови методы так, чтобы их название отражало то, что они делают. PHP: <?php $tpl = new view('my.phtml'); $tpl->a = 'aaaa'; var_dump($tpl); echo '<hr>'; $tpl->flush(); echo '<hr>'; echo '<hr>'; $tpl->a = 'bbbb'; var_dump($tpl); echo '<hr>'; $tpl->flush();
Simpliest ты начал в таком тоне, что я решил что ты стебешься PHP: <?php class view { const CACHE_SWITCH = 1; const CACHE_DIR = './cache'; private $cacheFilename = null; private $_vars = array(); private $_path = null; protected $_content = null; public function __construct($_path) { $this -> _path = $_path; $this -> cacheFilename = self::CACHE_DIR.'/'.md5($this -> _path); } public function setCacheFilename($name) { $this -> cacheFilename = self::CACHE_DIR.'/'.md5($name); } public function __set($var, $val) { $this -> _vars[$var] = $val; } public function __get($var) { if (isset($this -> $var)) { return $this -> $var; } return $this -> _vars[$var]; } public function flush() { if (self::CACHE_SWITCH == 1) { $cacheFilename = $this -> cacheFilename.'.cache'; $cachedContent = null; $templateVars = $this -> getTemplateVars(); if (file_exists($cacheFilename)) { $cachedContent = unserialize(file_get_contents($cacheFilename)); } if ($templateVars == $cachedContent[0]) { $this -> _content = $cachedContent[1]; } else { $cachedContent = array($templateVars, $this -> getContent()); file_put_contents($cacheFilename, serialize(&$cachedContent)); } } echo $this -> getContent(); } private function getContent() { if ($this -> _content == null) { extract($this -> _vars); ob_start(); include($this -> _path); $this -> _content = ob_get_clean(); } return $this -> _content; } private function getTemplateVars() { $templateVars = array(0 => $this -> _path, 1 => array()); foreach ($this -> _vars as $name => $val) { if (is_object($val)) { $templateVars[1][$name] = $val -> getTemplateVars(); } else { $templateVars[1][$name] = $val; } } return $templateVars; } public function __toString() { return $this -> getContent(); } }
PHP: <?php $tpl = new view('my.phtml'); $tpl->a = 'aaaa'; var_dump($tpl); echo '<hr>'; $tpl->flush(); echo '<hr>'; echo '<hr>'; $tpl->a = 'bbbb'; var_dump($tpl); echo '<hr>'; $tpl->flush(); все правильно, надо просто так PHP: <?php $tpl = new view('./srv/my.phtml'); $tpl->a = 'aaaa'; var_dump($tpl); echo '<hr>'; echo $tpl; echo '<hr>'; echo '<hr>'; $tpl = new view('./srv/my.phtml'); $tpl->a = 'bbbb'; var_dump($tpl); echo '<hr>'; echo $tpl; echo $tpl; - чтобы шаблон не кэшировался, пересоздавать объект - быстродействие не затормозит, все равно include будет каждый раз что намного медленнее, + поощряет разбивать большие шаблоны на мелкие =)
Бгг, а эту багу мы назовем фичей... Правильно что? Данные в шаблоне изменились - кеш не инвалидировался. Что правильного? Мне для инвалидации кеша создавать новый инстанс шаблона? Это норма? Ну-да, ну-да. В совокупности с верой в собственную непогрешимость... "маемо тэ що маемо"... flush() что делает? (выводит содержимое чего?) getContent() что делает? (возвращает содержимое чего?) Отдавать из кеша или нет - у тебя где контролируется? А почему там?
опоздал я немного с правкой мессаги знаешь, я уважаю вежливость. Невежлевые замечания я обычно игнорирую. интуитивно понятно чего - шаблона, какое еще содержимое может быть в этом объекте? шаблона конечно, чего же еще? при вызове flsuh кэшируется и извлекается из кэша, при __toString - просто выводится. Потому что в первом случае с объектом работаешь как с объектом, а во втором - как с строкой, и неочевидно, что при этом могут произойти какие-то еще действия кроме вывода.