«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/04/17 04:39:03  №1382653 1
В задании про список студентов оп говорит, что валидатору инфы о студенте нужно в конструктор передавать объект tablegateway, чтобы валидатор мог, например, смотреть, есть ли а базе такой email. Контроллерам тоже нужно будет вызывать методы tablegateway, чтобы работать с базой. Значит в конструктор контроллера надо передавать тоже этот объект tablegateway? А если у меня объект контроллера в роутере создаётся, то сначала объект tablegateway нужно в роутер передавать прямо из index.php? Это и есть Di?
Ответы: >>1382741 >>1385181
Аноним 2019/04/17 23:04:47  №1383151 2
Ответы: >>1385179
Аноним 2019/04/18 04:43:15  №1383193 3
Зачем оп с списке студентов советует создать константу пола (const GENDER_MALE) в модели студента, если мы и так в конструктор будем пол передавать и записывать его в обычное поле, как и все остальное?
Ответы: >>1383195 >>1383545 >>1385179
Аноним 2019/04/18 04:47:47  №1383195 4
>>1383193
Шоб везде писать

$vasya->setGender(User::GENDER_MALE);

if ($vasia->getGender() === User::GENDER_MALE) {
...
}
Ответы: >>1383372 >>1383545
Аноним 2019/04/18 09:54:49  №1383372 5
>>1383195
>$vasya->setGender
не скрепно как-то
вася должен быть сразу создан с правильным гендером безо всяких сеттеров
Ответы: >>1383408 >>1383858
Аноним 2019/04/18 10:39:33  №1383408 6
>>1383372
Вот я и спросил, зачем тут const. Лишний код только придется писать,типа если переданный пол в конструктор == male, то $this->gender = GENDER_MALE.
Ответы: >>1383428 >>1385179
Аноним 2019/04/21 00:37:34  №1385179 7
>>1383193
>>1383408

Для случаев, когда есть выбор из нескольких значений, эти значения принято обозначать константами. Плюсы: защита от опечаток; видно, какие есть вообще варианты значения; видно, что это не случайная строка; автодополнение в IDE.

То есть Student::GENDER_MALE говорит гораздо больше, чем просто строка 'male' или число 1.

И в конструктор ты будешь передавать сразу константу.

>>1383151

> if (($answer == $this->answer) || array_search($answer,$this->deviation) != FALSE){

Тут явно что-то неправильно сделано. Для ответа с погрешностью тебе надо лишь проверить, что ответ находится в диапазоне (правильный ответ - погрешность; ответ + погрешность). То есть обычные сравнения больше/меньше.

> if (property_exists($question,'options') == TRUE){
> echo "Варианты ответов:\n";

А вот это неправильно. Это какой-то костыль. Тут получается, если у нас есть 10 видов вопросов, мы должны написать 10 ифов. Правильнее было бы сделать так: сделать в вопросе метод printQuestion() и пусть каждый вопрос сам определяет, как его надо выводить. Так мы можем добавлять новые типы вопросов, не трогая старый код.

> Правильно ли
> function checkTotalAnswers пытаться поместить в класс Questions?

Думаю, что нет, так как Question представляет один вопрос, а функция работает со множеством вопросов.
Ответы: >>1385271
Аноним 2019/04/21 00:38:31  №1385181 8
>>1382653

Если следовать принципу DI, то да, в контроллер надо передавать нужные ему объекты (зависимости) снаружи. Соответственно, создание контроллера мы поручаем DI контейнеру, который и передаст ему эти зависимости. Роутер берет контроллер из контейнера, а не создает сам.

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

И роутер (который на самом деле Front Controller, а не просто роутер) можно исключить из DI по той же причине.

> А если у меня объект контроллера в роутере создаётся, то сначала объект tablegateway нужно в роутер передавать прямо из index.php? Это и есть Di?

В DI обычно объекты создает DI контейнер, а не роутер. В роутер проще передать DI контейнер и брать контроллеры из него. Хотя, если тебе очень хочется, можно и для роутера задействовать DI, передавая в него все объекты контроллеров снаружи, и сам роутер поместить в DI контейнер.

Ответы: >>1385271
Аноним 2019/04/21 08:47:53  №1385271 9