За последние 24 часа нас посетили 17500 программистов и 1599 роботов. Сейчас ищут 1138 программистов ...

Наши программы!!! (неразобранное)

Тема в разделе "Решения, алгоритмы", создана пользователем Hight, 28 авг 2006.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    *цензура, блин!*
    *сурово* Владсон, совсем от рук отбился...
    Олег.
     
  2. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    Vladson, класс прост и тем хорош. удобен.
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Попытка ответить №2
    "Речь не о физическом размере кода или его скорости, а о рациональности использования 2-х и более функций вместо использования одной при условии одинакового функционала"
     
  4. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dark-demon
    Vladson
    Что рациональней? strcmp vs strncmp, либо strcmp с дополнительным параметром?
    Ответ: разницы нет. Одному больше нравится одно, другому другое. Вопрос совершенно не принципиальный.
     
  5. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Dagdamor, нет, вопрос именно и исключительно принципиальный :)
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    strncmp это более новая функция по этому их стало две (чтоб не вызвать неудобств) в свою очередь если функция задумана сразу со всеми параметрами то она должна быть одна (как например сделано в случае с mysql_fetch_array)
     
  7. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    :)

    она возвращает либо ассоциативный массив, либо индексный, либо комбинировнный. где может быть полезен последний вариант - моей фантазии не хватает. для второго существовала mysql_fetch_row(), а вот для первого приходилость юзать неудобную конструкцию mysql_fetch_array($res,MYSQL_ASSOC), поэтому в четвёртом пыхе появилась функция mysql_fetch_assoc()
     
  8. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Там, где выключен мозг и для написания книжек. :)
     
  9. AntonShevchuk

    AntonShevchuk Активный пользователь

    С нами с:
    6 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Kharkov
    Есть такая CMF/CMS phpXCore - созданная мной и моей командой. Вот несколько фич:


    • MVC контроллер
      Поддержка PHP4 и PHP5
      Диспетчер URL c применением регулярных выражений (для генерации ЧПУ)
      Поддержка и интеграция PEAR пакетов (http://pear.php.net)
      Использование Smarty (http://smarty.php.net)
      Простая AJAX интеграция (http://xajaxproject.org)
      JavaScript framework (http://script.aculo.us)

    Описывать что есть в системе - это долго, можно заглянуть в вики:
    дока по компонентам системы
    дока по CMF

    Если система как таковая Вас не заинтересовала, то я думаю всегда интересно поковыряться в чужой архитектуре и классах...
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Посмотрел на названия компонентов и задумался. Есть такие Х-технологии, которые активно продвигает W3C, не боитесь, что названия могут пересечся? ;)
     
  11. Davil

    Davil Guest

    +1. Только почему контроллер?
    А MySQL 3.23 она не держит?
    Лень написать свой шаблонизатор заточеный под двиг?
     
  12. dark991

    dark991 Активный пользователь

    С нами с:
    23 апр 2006
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Москва
    засекаем время выполнения скрипта:

    fscript_time.php
    PHP:
    1.  
    2. <?
    3. function script_time ($start_time) {
    4.  
    5.     $stime = explode(" ",$start_time);
    6.     $stime = $stime[1] + $stime[0];
    7.  
    8.     $etime = microtime();
    9.     $etime = explode(" ",$etime);
    10.     $etime = $etime[1] + $etime[0];
    11.  
    12.     $totaltime = ($etime - $stime);
    13.     printf ("<p>Страница сгенерирована за %f секунд !</p>", $totaltime);
    14.  
    15. }
    16. ?>
    17.  
    index.php
    PHP:
    1.  
    2. <?
    3. // засекаем время начала выполнения скрипта, должно быть в файле заголовков html, напр. header.php
    4. $start_time = microtime();
    5. ?>
    6. <p>а тут будет сайт :-)</p>
    7. <?
    8. // самые последние строки во всех скриптах, должно быть в файле заголовков html, напр. footer.php
    9. include "fscrpt_time.php";
    10. script_time($start_time);
    11. ?>
     
  13. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. function execTime() {
    3.     static $start = 0;
    4.  
    5.     if (!$start) {
    6.         $start = microtime(true);
    7.     } else {
    8.         printf('%.8f', microtime(true) - $start);
    9.     }
    10. }
    11.  
    12. execTime();
    13.  
    14. // Some code...
    15.  
    16. execTime();
    17. ?>
     
  14. Davil

    Davil Guest

    Ктонить из модеров удалите этот бред дабы не смущать меня и посетителей данного топика...
     
  15. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    целиком подобные классы не использую, но изложу какие к ним требования:
    1) основное - возможность переноса с платформы на платформу.
    2) уже реализованный необходимый функционал (перепрыжки по разным базам, стандартная обработка ошибок,подсчет кол-ва запросов, етс )
    3) унификация интерфейса.


    что приходилось использовать по частям:

    function setdb($dbname='',$connect='') {

    function startUpdate() {

    function endUpdate() {

    function LastUpdated() {
    $out = $this->updateFlag;
    return $out;
    }
    function addlog($table, $params,$keyname,$key) {

    function countquery($ask='',$func='other') {
    static $queries;
    static $sum;
    if (!(isset($queries))) { $queries=array(); $sum=0; }
    if ($ask!='') return $sum;
    if (!(isset($queries[$func]))) { $queries[$func]=1; } else {$queries[$func]++; }
    $sum++;
    }


    Попадались такие вещи, при запросе limit=1,100 уже неплохо нагружает систему лишним перебором массива.
    Произвольный доступ нужен не ко всем записям и полям, его обычно стоит использовать после общей обработки, а не до. Если нужен до, то стоит пытаться решить это средствами бд.

    Дополнительно удобная функция для унификации использования справочников.
    PHP:
    1. function xsqlcashe($sql,$id) {
    2. $q=xquery($sql);
    3. $out=array();
    4. while($row=mysql_fetch_assoc($q)) {
    5.     $out2=array();
    6.     foreach ($row as $key=>$value) {
    7.         $out2[$key]=$value;
    8.     }
    9.     $out[$row[$id]]=$out2;
    10. }
    11. return $out;
    12. }
    13.  
    использование:
    PHP:
    1. function GetUsersFio($id)
    2. {
    3. static $cashe;
    4. if (!isset($cashe)) {
    5.     $sql="select us_fio,us_id from "._USERS_TBL;
    6.         $cashe=xsqlcashe($sql,'us_id');
    7. }
    8. if (isset($cashe[$id])) { return $cashe[$id]['us_fio']; } else { return false;}
    9. }
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    У меня явно другие требования к ним...
    (Моё главное требование это полное отсутствие абстракции, но увы похоже я одинок в этом)
     
  17. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    опиши свои. это непонятно.
    GetFullWhatMyLeftLegWantNowAndFormatted()
    ?
     
  18. Davil

    Davil Guest

    неа. В рбк один из ведущих программистов тоже против абстракции.
    Мое же мнение - абстракция полезна при написании блогов и гостевух.
    в серьезных проектах - это зло.
     
  19. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
  20. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    о, крестовый поход против абстракций? :)
     
  21. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    примитивный шаблонизатор:

    PHP:
    1. class tmpl {
    2. var $params=array();
    3. var $tdir;
    4. var $template;
    5.  
    6. function tmpl($template="simple_table",$templatedir="./tmpldir/common/") {
    7. $this->$tdir=$templatedir;
    8. $this->$template;
    9. require_once("IT.php");
    10. }
    11.  
    12. function setp($pname,$value) {
    13. $this->params[$pname]=$value;
    14. }
    15.  
    16. function p($name) {
    17. return $this->params[$name];
    18. }
    19.  
    20. function get() {
    21. $tpl = new HTML_Template_IT($this->tdir);
    22. $tpl->loadTemplatefile($this->template, true, true);
    23. $tpl->setvariable("BLANK",'');
    24. foreach ($this->params as $key=>$value) {
    25.     $tpl->setvariable($key,$value);
    26.  
    27. }
    28. return $tpl->get();
    29. }
    30.  
    31. }
    Применение:
    PHP:
    1. require_once('includes/t.inc.php');
    2.  
    3.  
    4. class xlist extends tmpl {
    5. var...
    6.  
    7.  
    8. function xlist($uid,$reftable,$postid,$list_field,$single_field='',$keyname='',$key='') { // , - для мультисправочника
    9. $this->tmpl();
    10. //$this->table=$table;
    11. $this->uid=$uid;
    12. $this->reftable=$reftable;
    13. $this->list_field=$list_field;
    14. $this->refkeyname=$keyname;
    15. $this->refkey=$key;
    16. $this->postid=$postid;
    17. }
    18.  
    19. //.............................................................................
    20. function getPlainXList($title,$list,$refname,$refid,$single='') {
    21. if ($refname!='') $this->refname=$refname;
    22. if ($refid!='') $this->refid=$refid;
    23. $this->setp('LISTFULLOPT',$this->getFullXListOptions());
    24. $this->setp('POSTID',$this->postid);
    25. $this->setp('UID',$this->uid);
    26. $this->setp('LISTVALUE',$list);
    27. $this->setp('TITLE',$title);
    28. $this->setp('LISTNAME',$this->list_field);
    29. $this->setp('LISTOPT',$this->getXListOptions($list));
    30. return $this->get();
    31. }
    32. //.............................................................................
    33.  
    34.  
    35. } // end class
    наследуемый класс уже никак не зависит от применяемого шаблонизатора, будь это пир, смарти или str_replace, пока любители смарти не успели перенести в него всю логику;
    Еще бы в вариант с str_replace'ом добавить регулярку для распознавания строк цикла
    <!-- BEGIN rowname -->
    ...
    <!-- END rowname -->

    и пир уже не нужен.
     
  22. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    он и с php-native не нужен :) ты вот объясни, чем твой шаблонизатор лучше...
     
  23. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Меня никто никогда не переубедит, что PHP луший активный шаблонизатор.
    Написал класс шаблонизатора с PHP подобным языком:
    PHP:
    1. <?php
    2. /**
    3.  * (C) 2007 Fedotov Sergey <sergey89@gmail.com>
    4.  */
    5.  
    6. /**
    7.  * Работа с шаблонами
    8.  */
    9.  
    10. class Parser {
    11.     static private $_plugins = array(
    12.         'metaCharset',
    13.         'tag',
    14.         'contentType',
    15.         'curDate',
    16.         'curTime',
    17.         'curDatetime',
    18.         'rfcDate'
    19.         );
    20.  
    21.     static private $_vars           = array();
    22.     static private $_vars_group     = array();
    23.     static private $_vars_global    = array();
    24.     static private $_dir            = './';
    25.  
    26.     // Установить директорию с шаблонами
    27.     static public function setDir($name) {
    28.         if ((substr($name, -1) == '/') || (substr($name, -1) == '\\')) {
    29.             $name = substr($name, 0, -1);
    30.         }
    31.  
    32.         self::$_dir = $name;
    33.  
    34.         return true;
    35.     }
    36.  
    37.     // Установить значение переменной
    38.     static public function setVar($name, $value) {
    39.         self::$_vars[$name] = $value;
    40.  
    41.         return true;
    42.     }
    43.  
    44.     // Установить значение глобальной переменной
    45.     static public function setGlobalVar($name, $value) {
    46.         self::$_vars_global[$name] = $value;
    47.  
    48.         return true;
    49.     }
    50.  
    51.     // Получить HTML код готового шаблона
    52.     static public function getHtml($fname) {
    53.         global $_config;
    54.  
    55.         if (file_exists(self::$_dir . DS . $fname)) {
    56.             if (isset(self::$_vars_global)) {
    57.                 foreach (self::$_vars_global as $name => $value) {
    58.                     $$name = $value;
    59.                 }
    60.             }
    61.  
    62.             foreach (self::$_vars as $name => $value) {
    63.                 $$name = $value;
    64.             }
    65.  
    66.             self::$_vars = array();
    67.  
    68.             $tpl_file = self::$_dir . DS . $fname;
    69.             $cache_file = CACHE_DIR . DS . 'templates' . DS . md5($tpl_file) . '.php';
    70.  
    71.             if ($_config['tpl']['cache']) {
    72.                 if (!file_exists($cache_file) || (filemtime($cache_file) < filemtime($tpl_file))) {
    73.                     $tpl = self::prepare($tpl_file);
    74.                     file_put_contents($cache_file, $tpl);
    75.                 }
    76.             }
    77.  
    78.             ob_start();
    79.             include $cache_file;
    80.             return ob_get_clean();
    81.         } else {
    82.             return false;
    83.         }
    84.     }
    85.  
    86.     // парсер щаблонов
    87.     public static function prepare($fname) {
    88.         $tpl = file_get_contents($fname);
    89.  
    90.         // плагины
    91.         foreach (self::$_plugins as $name) {
    92.             $tpl = preg_replace('#<\?(.*)_' . $name . '\((.*)\)(.*)\?>#Usi', '<?$1self::_' . $name . '($2)$3?>', $tpl);
    93.         }
    94.  
    95.         // директивы
    96.         $tpl = preg_replace('#<\?use\s+(\$[a-zA-Z_][a-zA-Z0-9_]*)\s*\?>#Usi', '<?global $1?>', $tpl);
    97.         $tpl = preg_replace('#<\?set\s+\'([a-zA-Z_][a-zA-Z0-9_]*)\'\s*,\s*(.*)\s*\?>#Usi', '<?self::setVar(\'$1\', $2)?>', $tpl);
    98.         $tpl = preg_replace('#<\?get\s+\'(.*)\'\s*\?>#Usi', '<?=self::getHtml(\'$1\')?>', $tpl);
    99.         $tpl = preg_replace('#<\?type\s+\'(.*)\'\s*\?>#Usi', '<?header(\'Content-type: $1\')?>', $tpl);
    100.  
    101.         // альтернатива {, } и } else {
    102.         $tpl = preg_replace('#<\?\s*else\s*\?>#Usi', '<?} else {?>', $tpl);
    103.         $tpl = preg_replace('#<\?(.*)\s*:\s*\?>#Usi', '<?$1 {?>', $tpl);
    104.         $tpl = preg_replace('#<\?\s*end\s*\?>#Usi', '<?}?>', $tpl);
    105.  
    106.         // подготавливаем к short_open_tags off
    107.         $tpl = preg_replace('#<\?\s*\?>#Usi', '', $tpl);
    108.         $tpl = preg_replace('#<\?([^=].*)\?>#Usi', '<?php $1?>', $tpl);
    109.         $tpl = preg_replace('#<\?=\s*(.*)\?>#Usi', '<?php print $1?>', $tpl);
    110.  
    111.         return $tpl;
    112.     }
    113.  
    114.     private static function _metaCharset($charset) {
    115.         return '<meta http-equiv="Content-Type" content="text/html; charset=' . $charset . '" />' . "\n";
    116.     }
    117.  
    118.     private static function _tag($tag) {
    119.         return '<?' . $tag . '?>' . "\n";
    120.     }
    121.  
    122.     private static function _curDate($format = 'd-m-Y') {
    123.         return date($format);
    124.     }
    125.  
    126.     private static function _curTime($format = 'H:i:s') {
    127.         return date($format);
    128.     }
    129.  
    130.     private static function _curDatetime($format = 'd-m-Y H:i:s') {
    131.         return date($format);
    132.     }
    133.  
    134.     private static function _rfcDate($timestamp = TIME) {
    135.         return date('r', $timestamp);
    136.     }
    137. }
    138. ?>
    Стоит заметить, что класс выступает в роли пространства имён. Пример создания RSS ленты.
    Шаблон:
    Код (Text):
    1. <?use $_encoding?>
    2. <?type 'text/xml'?>
    3. <?=_tag('xml version="1.0" encoding="' . $_encoding . '"')?>
    4. <rss version="2.0"
    5.     xmlns:content="http://purl.org/rss/1.0/modules/content/"
    6.     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    7.     xmlns:dc="http://purl.org/dc/elements/1.1/"
    8.     >
    9. <channel>
    10.     <title><?=$title?></title>
    11.     <link>http://<?=$_SERVER['HTTP_HOST']?></link>
    12.     <description><?=$desc?></description>
    13.     <generator><?=$gen?></generator>
    14.     <language><?=$lang?></language>
    15.  
    16.     <?foreach($items as $item):?><item>
    17.         <title><?=$item['title']?></title>
    18.         <link><?=$item['link']?></link>
    19.         <pubDate><?=_rfcDate($item['date'])?></pubDate>
    20.         <description><![CDATA[<?=$item['desc']?>]]></description>
    21.         <content><![CDATA[<?=$item['msg']?>]]></content>
    22.     </item>
    23.     <?end?>
    24.  
    25. </channel>
    26. </rss>
    Обработчик:
    PHP:
    1. <?php
    2. $_encoding = 'UTF-8';
    3.  
    4. Parser::setVar('title', 'Test RSS Feed');
    5. Parser::setVar('desc',  'RSS Feed generated by PHPS Parser 1.0');
    6. Parser::setVar('gen',    'PHPS Parser 1.0');
    7. Parser::setVar('lang',  'RU');
    8.  
    9. $items = array();
    10.  
    11. // Test data
    12. for ($i = 0; $i < 3; $i++) {
    13.     $items[] = array(
    14.             'title' => 'Title #' . $i,
    15.             'link'  => 'http://localhost/news/' . $i . '/',
    16.             'date'  => time() + $i * 10,
    17.             'desc'  => 'Description #' . $i,
    18.             'msg'    => 'Message #' . $i,
    19.         );
    20. }
    21. Parser::setVar('items', $items);
    22.  
    23. Parser::setDir(dirname(__FILE__));
    24. print Parser::getHtml('index.tpl');
    25. ?>
     
  24. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ещё более примитивный
    PHP:
    1. <?php
    2. Class Template {
    3.    var $variables;
    4.    function assign($array) {
    5.       $this->variables = array_merge($this->variables, $array);
    6.    }
    7.    function parse($name) {
    8.       extract($this->variables);
    9.       include $name;
    10.    }
    11. }
    12. ?>
    Пример использования
    PHP:
    1. <?php
    2. include "template.php";
    3.  
    4. $template = new Template();
    5.  
    6. // теперь мы можем добавлять любые значения
    7. $template->assign(array(
    8.     'title'=>'Test'
    9. ));
    10.  
    11. // в любых количествах
    12. $template->assign(array(
    13.     'content'=>'Сontent',
    14.     'content2'=>'Content 2'
    15. ));
    16.  
    17. // И выводить их на экран.
    18. $template->parse('test_tpl.php');
    19. ?>
    PHP:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
    2.     "http://www.w3.org/TR/html4/strict.dtd">
    3. <html>
    4.    <head>
    5.       <title><?=$title?></title>
    6.    </head>
    7.    <body>
    8.       <p><?=$content?></p>
    9.       <p><?=$content2?></p>
    10.    </body>
    11. </html>
    А вот такой-же только лучше http://www.massassi.com/php/articles/template_engines/
     
  25. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    писать php на php - это свежо :)