• Как сделать шаблоны в php?

    nefone
    @nefone
    Junior PHP разработчик
    Если не подходят что то из готовых шаблонизаторов типа Smarty
    Можете сделать свой на основе PHP функций работы с буфером вывода:
    ob_start
    ob_get_clean
    /**
     * Функция загрузки шаблона
     * 
     * @param string $template Путь до файлов шаблона
     * @param mixed[] $data Данные для подстановки в шаблон
     * @return string Возвращает готовый код шаблона
     */
     function render_template($template, $data) {
         ob_start();
         if (file_exists($template)) {
             extract($data);
             require($template);
         } else {
             print('Нет файла шаблона: '.$template);
         }
         $html = ob_get_clean();
         return $html;
     }


    Пример использования:
    $content = render_template('templates/main.php', ['title' => 'Главная страница');
    
    echo $content;


    Код main.php
    <html>
     <head>
        <title><?=$title?></title>
     </head>
    </html>
    Ответ написан
    6 комментариев
  • Как правильно создать массив строк?

    GavriKos
    @GavriKos
    Скорее всего причина в выделении памяти и том, где и когда она будет выделена.
    Преимуществом это назвать нельзя - это просто факт. В каких то случаях это не будет преимуществом
    Ответ написан
    Комментировать
  • Как правильно создать массив строк?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Обычно массивы используют, чтобы по ним проходиться подряд. Современные процессоры очень хорошо работают, если данные идут подряд в памяти. Поэтому двумерный массив символов будет работать быстрее благодаря кэшу. Если же это указатели на строки, то каждая строка лежит где попало.

    Однако, если строк много, они большие, вы чаще обращаетесь к случайным из них, и они вам даны извне, то подход с указателями предпочтительнее. В этом случае при создании массива вы не будете копировать строки. А преимущество от кэша при такой работе с массивом ничтожно.
    Ответ написан
    1 комментарий
  • Почему в массив размером N можно положить больше чем N элементов?

    @res2001
    Developer, ex-admin
    В malloc при передаче в качестве аргумента нуля возвращаемое значение не определено (implementation-defined). Так что фиг знает что там вам вернул маллок. Но раз программа не падает, то, возможно, он вернул какой-то указатель на стек, а в стеке у вас есть ~8МБ - развлекайтесь.
    В общем не нужно так делать. На другом компиляторе (или на том же, но другой версии) поведение может быть совсем другим.
    Ответ написан
    Комментировать
  • Почему в массив размером N можно положить больше чем N элементов?

    15432
    @15432
    Системный программист ^_^
    Потому что в языке Си вы сами должны контролировать работу с памятью и следить, чтобы не происходило записи за пределы массива, переполнения стека и т.д.

    В данном случае из-за такой записи за границы допустимого возможны любые глюки вплоть до падения программы.
    Ответ написан
    Комментировать
  • Почему в массив размером N можно положить больше чем N элементов?

    GavriKos
    @GavriKos
    Потому что си.
    Он не проверяет как вы там корректно или нет с памятью работаете.
    Кстати еще очень зависит от настроек компилятора - в условном дебаге и релизе может быть разное поведение
    Ответ написан
    Комментировать
  • Как сделать "trait Rust" на Си?

    @cython
    Это можно реализовать преобразованием указателя на существующую структуру в структуру-трейт, который описывает нужные свойства. Но при таком подходе, при несоответствии трейту, будет Segmentation Fault
    #include <stdio.h>
    
    void say_colour(char *s);
    void say_colour(char *s){  printf("машина цветом %s",s);}
    
    typedef struct { // Трейт
    	char z[10];
    	void(*say_colour)(char* s);
    } Colour;
    
    typedef struct {
        char z[10];
        void(*say_colour)(char *s);
        int a; // Доп свойство
    } Blue;
    
    typedef struct{
        Colour* colour;
    } Car;
    
    int main(int argc, char const *argv[]){
        Blue b = {.z ="blue",.say_colour=say_colour};
        Car car = {
        	.colour = (Colour*)&b // Преобразуем Blue в Colour
        };
        car.colour->say_colour("dsfd");
        
        return 0;
    }
    Ответ написан
    1 комментарий