• С чего начать изучать математику?

    @SEOVirus
    Нафига она нужна, если не нужна? :)
    Как цель возникнет - так и учите по цели. Иначе посвятите жизнь тому, что вам не понадобится.
    Ответ написан
    1 комментарий
  • Как по-правильному (best practice) организовать проект на php в процедурном стиле?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Аналогично. И в ООП-стиле можете организовать также.
    Организация папок не коррелирует со стилем программирования.
    Ответ написан
    Комментировать
  • Как правильно начать обучение па java, кокой путь выбрать?

    AlexMaxTM
    @AlexMaxTM
    при вопросе книги или видео крусы, то однозначно книги, так как они дают систематические знания. Видео курсы обычно раскрывают какую-то одну сторону, но не дают целостной картины.
    Ответ написан
    1 комментарий
  • SEO специалисты утверждают, что SEO очень сложная наука, а учителя по SEO совсем другое. Кому верить?

    Кому верить?


    Верь маме. Все остальное подвергай сомнению :)
    Ответ написан
    Комментировать
  • Данные php в HTML шаблоне. Как реализовать?

    @McBernar
    Все используют код в шаблонах. Добавляя новый уровень абстракции типа [CHAR-1], вы лишь усложняете себе жизнь.
    Ответ написан
    Комментировать
  • Как с нуля построить MVC движок?

    zorca
    @zorca
    Держите пример для старта. Учился в начале года на курсах и накропал такой велосипед:

    https://github.com/steelcat/loft-php-2016/tree/mas...

    Сейчас конечно это все выглядит наивно и в чем то неправильно. Но изучать PHP нужно самому наступая на грабли, а не брать готовое. Иначе не сразу поймешь, а зачем же сделано так, а не вот так?
    Ответ написан
    Комментировать
  • В чем разница между этими запросами?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    В первом случае используется ActiveRecord, работа с моделью.
    ActiveRecord is the base class for classes representing relational data in terms of objects.

    Во втором построитель запросов Query, не зависит от СУБД.
    Query represents a SELECT SQL statement in a way that is independent of DBMS.
    Ответ написан
    Комментировать
  • Как проверить существование класса?

    @MadridianFox
    Web-программист, многостаночник
    1) это где такие лабораторные дают, что необходимо фреймворк написать?))
    2) а вы уверены, что вам нужна рефлексия и динамика вообще? Почему вы считаете, что использование неймспейсов это проблема?

    По PSR-4 неймспейсы как раз используются для автозагрузки классов, потому что неймспейс по сути должен повторять путь до класса. У вас какой-то не универсальный автолоад, как же файлы в других папках? Как вы будете подгружать классы из папок внутри папки controllers?
    Правильный подход - получать полное имя класса (с неймспейсом) и при автолоаде просто заменять слэши на прямые, чтобы получить путь до файла.

    Свой автолоад это обязательное условие? можно просто воспользоваться композером. Обязательно автолоад делать через устаревший __autoload(), а не через общепринятый spl_autoload_register()?

    Создать объект класса используя его название в строке можно просто используя переменную:
    $classname = "app\\controllers\\MainController";
    $methodname = "actionIndex";
    $controller = new $classname(); // тут сработает автолоад
    
    $controller->{$methodname}();


    При этом вы можете (и должны) обеспечить безопасность, так чтобы никто не мог передать через GET и имя класса и имя метода, и вызвать любой метод. Делается это очень легко.
    Во-первых путь из GET к нам приходит имя класса без неймспейса, ну логично. Неймспейс мы потом прицепим к нему. Так никто не сможет случайно создать объект любого класса, а только объект класса из папки с контроллером. Это не возбраняется.
    Во-вторых, если кто-то передал абра-кадабру, то надо не падать с ошибкой Class not found, логично. Для этого, перед созданием класса просто смотрим на то какие файлы есть в папке с контроллерами. Если там нет файла с тами же именем что и класс - то показываем 404.

    Потом, перед тем как вызвать метод, проверяем что он существует функцией method_exists($obj, $method_name), опять же - метода нет -- идите-ка вы на 404.

    И это нормально, что рефлексия и проверка существования класса требуют полное имя класса. Это ваш подход неверный - с самого начала вы должны прицепить к имени класса неймспейсом и работать только с полным именем.
    Ответ написан
    Комментировать
  • Что нужно знать для изучения yii2?

    AlexMaxTM
    @AlexMaxTM
    Для начала надо знать PHP и ООП. Без этих знаний будет очень сложно. Попробуйте открыть официальную документацию, она начинается с того, что создаем шаг за шагом первое простое приложение. Если покажется не сложным, то можно двигаться дальше. Если что-то не понятно, то надо будет подучить основы.
    Ответ написан
    1 комментарий
  • Объединить php и javascript?

    @vashaaa
    Юх с горы
    Давай давай, ещё sql туда, css не забудь запихать. Все в один файл, так же удобнее
    Ответ написан
    1 комментарий
  • Как подменить значение поля select?

    Stalker_RED
    @Stalker_RED
    <select id="author_id" name="author_id">
      <option value="1">Стивен Кинг</option>
      <option value="2">Джек Лондон</option>
    </select>

    круто, да?
    Ответ написан
    2 комментария
  • Каким должен быть правильный контроллер?

    sanek_os9
    @sanek_os9
    Работаю с Laravel, Vue, Vuetify, AWS Amazon, Linux
    Нету единого правильного способа реализации MVC, поэтому в Laravel, Yii2 и других фреймворках и проектах реализовано правильно, но по своему. Вам же стоит использовать не какой-то "правильный" подход реализации, а более удобен и понятен вам, не зацикливайтесь сильно о других людях которые придут на ваше место потому что всем не угодить, некого универсального подхода нету, достаточно тщательно комментировать свой код и писать код так что бы его легко было масштабировать и вносить любые другие правки.
    По поводу холиварах о том какой должна быть модель, выдержка из статьи:
    В описании оригинальной реализации MVC в Smalltalk упоминается о пассивной и активной модели. Пассивная модель не осведомлена о существовании представления, контроллера, и даже о своем участии в MVC-триаде. Контроллер отслеживает изменения модели и оповещает представление. При этом либо контроллер передает представлению информацию об изменениях, либо представление самостоятельно выбирает данные из модели. Более изящным решением является активная модель. Активность модели проявляется в ее праве самостоятельно оповестить представление об изменении своего состояния. Чтобы не нарушить основное требование MVC о независимости модели от представления и контроллера, механизм оповещения реализуется на основе шаблона проектирования Observer.

    А так же сама статья рекомендуемая к прочтению: rsdn.org/article/patterns/generic-mvc.xml
    Ответ написан
    Комментировать
  • Какую взять ORM для своего проекта?

    @D3lphi
    Возьмем ORM из двух популярных PHP-фреймворков. Первая будет Eloquent ("Родная" для фреймворка Laravel), а вторая - Doctrine (Одна из доступных ORM в фреймворке Symfony). Кардинальным отличием этих двух "систем" является то, что первая разработана на основе паттерна Active Record, а вторая - с использованием паттерна Data mapper. Чем же они отличаются? Приведу абстрактные примеры кода для первого и второго паттерна:

    Active Record:
    $user = new User(); // Создаем "сущность" нового пользователя.
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    $user->save(); // Сохраняем пользователя.


    Все, новый пользователь создан и находится в базе данных. Теперь, Data mapper:
    $user = new User();
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    
    $manager = ... // получаем объект менеджера (Например, из DI контейнера).
    $manager->persist($user); // "Скармливаем" новоиспеченного пользователя нашему менеджеру.
    // $manager->persis($user1); // Мы можем создать еще одного пользователя и уведомить менеджер об этом.
    // $manager->persis($user2); // И еще одного...
    $manager->flush(); // После выполнения этого метода данные отправятся в базу данных.


    Очевидно, первый способ куда проще. Но не все так просто. Дело в том, что паттерн Active Record нарушает принцип единственной ответственности (Single responsibility SOLID). И поэтому, в какой-то степени, может считаться антипаттерном. (Но это ни в коем случае не значит, что его не нужно использовать, для большинства проектов "хватит" за глаза). Наша сущность пользователя делает слишком много. Она не только представляет данные, но и еще работает с ними. В больших проектах это может усложнить поддержку кода. Data mapper, напротив же, разделяет представление данных в сущность (user) и работу с данными (manager, в данном примере. Также, за работу с данными отвечает репозиторий. Вы столкнетесь с ним, как только вам потребуется получить данные из БД (Doctrine)). В небольших проектах вы не заметите особой разницы. Разве что во втором случае увеличится количество классов. Так, в Eloquent вы создаете 1 модель, а в Doctrine - сущность и репозиторий.

    Все современные ORM включают в себя также, так называемые, query builder'ы. Они помогают отказаться от языка запросов, такого как SQL. Вы будете составлять запросы таким образом:
    $result = $qb
          ->select(['id', 'login'])
          ->where('id', '<>', 3)
          ->get();


    Собственно, query builder'ы помогают абстрагироваться от конкретной СУБД. То бишь, вы написали запрос 1 раз, а затем от того, какую СУБД вы используете будет зависеть выходной sql код. Генерация этого кода будет произведена абсолютно прозрачно для вас.

    Обе ORM имеют работать с отношениями. Вам нужно будет указать, как таблицы относятся друг к другу, а затем вы сможете удобно обращаться к связанным сущностям.

    Теперь конкретно. Так как вы только начинаете осваивать ORM, я бы порекомендовал начать с Eloquent. Она гораздо проще, чем Doctrine, да и более производительная, к тому же. Как освоите Eloquent, смело учитесь работать с Doctrine. Она обязательно должна быть "в копилке" ваших скиллов, так как является самой мощной в "мире" PHP.

    Успехов!
    Ответ написан
    2 комментария
  • Скрипт "установки" php движка. Как реализовать?

    @D3lphi
    Реализуемо ли такое вообще?

    Нет, не реализуемо. Это засекреченные разработки советских ученных.

    А если серьезно, то что вы хотите услышать? Как это писать?
    При входе человека на сайт, нужно проверять, установлено ли приложение (Есть множество вариантов, как это можно сделать: проверять наличие какого-либо файла(ов), проверять наличие какой-либо информации в нем (них) и тд). И, в зависимости от результата этой проверки, либо пускать его на сайт, либо выводить "окно установки". Во время установки собираем необходимую информацию. Производим создание необходим таблиц БД (Для подключения к ней, используем то, что указал юзер). Создаем пользователя администратора. В конце, генерируем файлы конфигурации. В них, как минимум, нужно занести информацию для соединения с базой данных. Остальные настройки можно хранить как в таких же файлах конфигурации, так и в базе данных, например.

    Ну вот, собственно, и все.
    Ответ написан
    1 комментарий
  • Верстка ul/li в несколько колонок?

    dudeonthehorse
    @dudeonthehorse
    Email Developer
    Если список получается посредством массива, то не составляет труда разбить массив на 3 списка, и не нужно ничего чудить. Если статика, то просто верстаем три списка типа ul.
    Ответ написан
    Комментировать
  • Подготовленные запросы в yii2?

    latteo
    @latteo
    Попробуйте вот так:
    $where = ''; 
    if(!empty($filter_time)) $where =" and date_created > now()-Interval :filter_time minute ";
    if(!empty($filter_category))
    $where.= "and path LIKE ':filter_category%' "; 
    
    $sql = Yii::$app->db->createCommand("SELECT COUNT(*) FROM Pages
    JOIN categories ON categories = id_categories WHERE status = 1 $where")
      ->bindValue(':filter_time', $filter_time)
      ->bindValue(':filter_category', $filter_category)
      ->queryScalar();
    Ответ написан
    2 комментария