Ответы пользователя по тегу PHP
  • Виновен ли я в самописном движке?

    @djay
    Ты виновен в том, что будучи неопытным взялся за реальный проект.

    Теперь запомни раз и навсегда:

    Во-первых:

    ЦМС - прежде всего это большой и долгий проект. Любую ЦМС - шлифуют, модернизируют, и улучшают годами и целыми командами разработчиков. Затем тысячи пользователей проверяют и тестируют её, сообщают о багах и недочётах.

    Во-вторых,

    Никого не заботит весит ли ЦМС 5 или 20МБ и что там внутри. Самое главное - чтобы была админка и основной контент можно было оттуда редактировать. Всё! Остальное для заказчика не важно и тебя не должно тоже волновать.

    А сеошнику тому не понравилось вот это:

    - все УРЛшки должны выглядеть понятно, например так (и обязательно должны быть закрывающий слэш!):
    site.com/novaya-stranica/
    site.com/nashi-kontacti/

    А у тебя они выглядели наверное так: site.com/page/1

    - Не было 301-редиректа. То есть если на сайт зайдту с www, то всё должно перенаправлятся на домен без www.

    - И скорее всего не было robots.txt, sitemap.xml и возможности редактировать основные мета-теги.

    И на будущее запомни: навык владения какой-либо популярной CMS ценится гораздо больше, чем наличие самописной.
    Ответ написан
    21 комментарий
  • Правильно ли в данном случае использовать статические методы?

    @djay
    Когда использовать статику а когда нет? Это классический вопрос.

    Минусы статики:

    - Нет конструктора
    В конструторе обычно инициализируются все зависимости класса, без которых он не будет работать. После того, как создал экзепляр класса - конструктор выполнился. А у статичного класса нет гарантии, что класс был инициализирован. Можно конечно обойти это убогими костылями и хаками типа - StaticClass::init(), но это не правильный дизайн, по любому.

    - Не сможешь писать юнит тесты аккуратно
    Сейчас пока ты не знаком с этим и с теорией TDD, но в будущем ты поймешь, что глобальные статичные классы - это зло, когда попытаешься протестировать метод, внутри которого статичные классы.

    Теперь по существу:

    Работа с базой - создание, редактирование пользователя, а также проверка на валидность авторизации лучше всего будеть поместить в один DataMapper класс. И вообще погугли что такое Data Mapper.

    class UserMapper
    {
         private $pdo;
         
         public function __construct($pdo)
         {
              $this->pdo = $pdo;
         }
    
         public function authValid($login, $password)
         {
             // Выполнил запрос к базе через $pdo и вернул true или false
         }
    }


    Затем в классе Auth, в методе attemp() просто вызываешь UserMapper передавая данные, а не пишешь логику там.
    Ответ написан
    2 комментария
  • Как установить Redis, Windows 8 x32, PHP 5.6?

    @djay
    Скачай лучше OpenServer - там Редис в коробке, готовый и настроенный.
    Ответ написан
    Комментировать
  • Почему autoload лучше не использовать?

    @djay
    1. Потому что он не поддерживает пространства имен (классы под namespace)
    2. Потому что, нельзя зарегистрировать несколько автозагрузчиков. Только один.
    Ответ написан
  • Корректно ли выполнять действия в конструкторе?

    @djay
    Конструктор - это механизм инициализации состояния класса. Он создан для того чтобы произвести начальную инициализацию свойств класса, так чтобы его новый обьект мог работать. А всякие проверки на существование файлов, или инициализации других обьектов должны строго выполнять после инициализации состояния.

    Это улучшает читабельность, в некоторых случаях даже производельность, и делает код более тестируемым.

    И кстати, лучше будет писать так:

    $starter = new Starter();
    $starter->prepare();


    В то время как тело метода prepare() содержит те методы и ту последовательность:

    $this->iniConfig();
    $this->rewriteHeaders();
    Ответ написан
    1 комментарий
  • Трогать фреймворк php или не надо?

    @djay
    Фреймворк - это всего лишь набор интструментов и подготовленная архитектура (структура папок и итд), не более того. Чаще в любом фреймворке всего ты будешь пользоватся такими вещами как:

    - Компонент валидации форм
    - Прослойка над базой (ActiveRecord/Data Mapper)
    - Роутер, контроллеры

    Для того чтобы понять это, можно рассмотреть такую задачу:

    Нужно написать электронную библиотеку, где будут такие фичи как: пагинации, фильтры над таблицей, сортировка и возможность управлять только зарегистрированным пользователям.


    На фреймворке ты сделаешь это за час-полчаса. Без фреймворка будешь изобретать все иструменты для решения задачи с нуля и в лучшем случае сделаешь это за месяц.

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

    @djay
    Почитай про нормализацию данных. В текущей задаче - это One-to-Many Relationships
    Сериализация в данном случае не верный подход, потому что:

    1. Сводит возможность поиска практически к нулю.
    2. Ухудшает производеленость, поскольку если понадобится хотя бы одна запись (цена например), то тогда придется парсить весь сериализованный текст.

    А так в целом, если у одного товара может быть несколько цен (теоритически - да хоть тысяча цен - не важно), то всё это должно хранится в отдельной таблице. И выбиратся джоином как One-to-Many Relationship.
    Ответ написан
    Комментировать
  • Где практиковаться php?

    @djay
    Единственный и самый эффективный способ - это начать делать что-то. То есть не будет такого, что ты начал делать и ничему при этом не научился. Этот способ самый надежный. Начни писать учебную CMS. Смотри в справочники по мере натыкания на вопросы.

    И да, если есть возможность иди работать стажером пусть даже за еду.
    Ответ написан
    3 комментария
  • Как "безболезненно" перейти с php 5.4 на php 5.6?

    @djay
    Версия 5.2 вышла где-то в июле 2006 года, а провайдеры убирать её стали только в 2013-2014 годах. Даже когда выйдет 7 версия, её еще очень долго будут тестировать, переделывать, прежде чем провайдеры начнут устанавливать её. Этот день, о котором ты говоришь наступит скорее всего лет через 5.

    Что касается переходов по версиям, ведь не факт, что они используют один и тот же `php.ini` файл (а следовательно настройки, в частности отображения ошибок там всяких). Каждая версия лежит в отдельной папке и использует свою сборку в 99.9% случаях. Есть вещи, которые были в 5.4 и они вызывали (E_NOTICE, E_DEPRECATED), но их полностью убрали с 5.6. Отсюда и белый экран. Быть может там одна ошибка? Легче всего включить отображение ошибок `(error_reporting(-1))` и не гадать.

    Да и вообще, если работает на 5.4 зачем вообще менять и трогать что-то? Работает - ну и пусть себе дальше работает.
    Ответ написан
    5 комментариев
  • PHP + фреймворк, существует книга по этой теме?

    @djay
    Тебе не нужно знать и думать , и даже читать код фреймворков. Всё что нужно знать - это как их использовать (то есть их API).

    Классический пример,
    Есть блок питания от компьютера. Всё что тебе нужно знать о нём - это сколько ват, и как его подключить к материнской плате. Тебе не нужно знать, что там внутри, как это всё работает, какие законы физики/электростатики там применяются. Ты - пользователь, а не завод.

    Точно так же с фреймворками. Не нужно вообще смотреть и заморачится на то что внутри. Открывай документацию и смотри какие методы API имеются и как их вызывать.

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

    @djay
    В данном случае, лучше всего будет доделать самому. Там всего лишь понадобится одна таблица + WYSIWYG редактор типа TinyMCE, CKEdtiror. Работы на час-два.

    Что касается встраивания других (мини) движков - то этого делать в данной ситуации не нужно. CRUD операции на одной таблице того не стоят.
    Ответ написан
    Комментировать