«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2021/02/05 15:01:26  №1931510 1
А как понять, что ты ООП достаточно изучил? Я вот начал читать про ООП, текста дохуя, нихуя не запоминается. Если каждый пример кода запускать, то я еще 100500 лет буду разбираться.
Ответы: >>1931546 >>1931722 >>1936147
Аноним 2021/02/09 22:19:53  №1936147 2
>>1931510

Попробуй решить задачу про ООП-Гостиницу, например: https://arhivach.net/thread/302511/#1082529 . Если не решается, значит, надо изучать ООП еще.

Еще есть задача про ООП-скидки: https://www.cyberforum.ru/php-oop/thread1459985.html

Более сложная задача - парсер математических выражений (сделанный на ООП), которому дается на вход математическое выражение вроде x(2a + b) + 5 + 3bx и он его упрощает до 2ax + 4bx + 5. Ну это конечно сложная задача, новичок над ней может месяц голову ломать. Но полезная. Там много классов получается. Я могу дать подсказку, если что.

Ответы: >>1938905 >>1951537
Аноним 2021/02/12 16:37:28  №1938905 3
>>1936147
Первая ссылка не рабочая
Ответы: >>1939079
Аноним 2021/02/12 20:01:48  №1939079 4
>>1938905

Она рабочая, просто надо домотать до задачи. Скопирую тогда сюда:

Есть Гостиница, в ней есть Номера. Для каждого Номера известен его номер, количество Гостей, которое в него влезет, а также цена за сутки. В Гостиницу приезжают Гости. Нужно сделать ООП-модель Гостиницы с такими возможностями:

- получить список свободных номеров на определенную дату
- получить список свободных номеров, которые будут свободны в определенный диапазон дат (от A до B)
- дан список Гостей и диапазон дат, в которые они хотели бы заселиться. Необходимо подобрать им самый дешевый и маленький Номер, который их вместит и который свободен в это время.
- то же самое, но при отстутствии одного подходящего номера для Гостей разрешается заселить их в несколько номеров, опять же, начиная с самых дешевых. Например, приехало 3 Гостя, но все 3-местные номера заняты и мы выделяем 2 2-местных, или 3 1-местных или 1-местный + 2-местный.
- зарегистрировать проживание данных Гостей в данных Номерах на данный период
- получить историю заселения Номера (кто в нем когда жил)
- получить историю заселения Гостя (в каких номерах он жил)
- получить статистику доходов Гостиницы за данный диапазон дат (в день A отдель заработал X тугриков, в день B - Y тугриков и так далее)

То есть надо создать классы, и сделать в них методы, которые вычисляют то, что описано выше.
Ответы: >>1951537 >>1958238
Аноним 2021/03/01 15:48:08  №1954883 5
внешний ключ должен быть связан только с первичным ключом?
Ответы: >>1957297
Аноним 2021/03/01 16:35:23  №1954919 6
Хранить массив в БД изврат?
Ответы: >>1954922 >>1957297
Аноним 2021/03/01 18:03:17  №1954984 7
$ticketnumber=mt_rand(1000000000000, 9900000000000);
почему он генерирует один и тот же набор при новой записи?
Аноним 2021/03/02 08:42:08  №1955284 8
>>1954984
С pdo не работал напрямую, такой код разве не даст SQL инъекцию? Или там в pdo все фильтруется?
Ответы: >>1957297
Аноним 2021/03/03 15:24:10  №1956650 9
если нужно отфильтровать и проверить 10 импутов-это на писать кучу кода на каждый импут?
Ответы: >>1957331
Аноним 2021/03/04 12:43:20  №1957257 10
>>1954984

В мануале по mt_rand упоминается функция mt_getrandmax(). Она возвращает максимальное число, которое можно передавать в mt_rand. Попробуй выполнить код var_dump(mt_getrandmax()); У меня он возвращает 2 миллиарда.

А ты передаешь 1 триллион. От этого mt_rand ломается. Как я понял, он работает только с числами от 0 до 2 млрд. Используй 2 вызова mt_rand, если тебе нужно сгенерировать длинное число.
Ответы: >>1957265
Аноним 2021/03/04 12:49:30  №1957265 11
>>1957257
Это же вроде как в настройках PHP указывается. Я проверял его числа в песочнице - там рандом нормально работает.

6051441335772
6139515971580
1001079545172
4806508211446
1196189095429
2364670928361
9178557967093
7900054432436
3104628173548
4715106407596
Ответы: >>1957331
Аноним 2021/03/04 13:08:43  №1957297 12
>>1954883

Не обязательно. Но он должен указывать на единственную запись, потому он может ссылаться либо на первичный ключ либо на колонку (или колонки) с уникальными значениями.

>>1954919

Зависит от ситуации. Вообще, принципы нормализации требуют атомарности ячеек, то есть в 1 ячейке хранится одно значение, а не список. Но в реальности иногда удобнее сохранить массив. Можно хранить значения через запятую, некоторые СУБД вроде Постгрес поддерживают хранение массивов, и можно туда засунуть JSON.

Но во многих случаях это будет неправильная идея. Ты не описал какая у тебя ситуация, потому непонятно, как правильнее сделать.

>>1955284

Он подставляет значения не напрямую ("INSERT .. $x"), а через плейсхолдер ("INSERT :x"). Значения автоматически экранируются и заключаются в кавычки и инъекции не будет.
Ответы: >>1957301
Аноним 2021/03/04 13:11:28  №1957301 13
>>1957297
> с уникальными значениями.
ты имеешь ввиду ключ unique key?
Ответы: >>1957331
Аноним 2021/03/04 13:23:37  №1957331 14
>>1956650

Вообще, если использовать библиотеку для работы с формами, то достаточно лишь описать тип и ограничения для каждого инпута, а она сама все проверит. Если же ты по каким-то странным причинам пишешь формы руками, то попробуй хотя бы в функции вынести повторяющийся код.

>>1957265

Ты выполни код var_dump(mt_getrandmax()); у себя. Может, в песочнице 64-битная версия PHP, а у тебя например 32-битная или еще какие-то отличия есть.

>>1957301

Я имею в виду, что они должны быть уникальными, и хорошо если это дополняется уникальным ключом.
Ответы: >>1957333 >>1957342
Аноним 2021/03/04 13:31:28  №1957342 15
>>1957331
>Если же ты по каким-то странным причинам пишешь формы руками,
таким макаром,вообще можно сильно не замарачиваться.как оно работает
Ответы: >>1957459
Аноним 2021/03/04 15:44:09  №1957459 16
>>1957342

Если хочется именно заморочиться, то можно написать свою библиотеку для форм. Делаем объект, представляющий один элемент формы, делаем такие элементы вкладываемыми друг в друга (чтобы можно было собрать из них форму). Делаем объекты, представляющие ограничения и условия проверки. Очень полезно для саморазвития, хотя и будет сложно поначалу.
Ответы: >>1957508 >>1957583
Аноним 2021/03/04 18:01:33  №1957583 17
>>1957459
создавать на каждое поле формы класс с методами проверки?
Ответы: >>1958122
Аноним 2021/03/05 11:21:49  №1958122 18
>>1957583

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

$form = new Form;
$form->addField('name', [
new TextLength(20),
new Regexp('/^[a-z]+$/')
]);
...

$form->handleRequest($_POST);
if ($form->isValid()) {
echo "Все верно";
} else {
print_r($form->getErrors());
}

то есть мы создаем форму и добавляем в нее поля, описывая ограничения в них.

Вот, как сделано в Симфони (отсюда: https://symfony.com/doc/current/components/form.html ):

$form = $formFactory->createBuilder()
->add('task', TextType::class, [
'constraints' => new NotBlank(),
])
->add('dueDate', DateType::class, [
'constraints' => [
new NotBlank(),
new Type(\DateTime::class),
]
])
->getForm();

Здесь есть классы, обозначающие тип поля (TextType, DateTYpe) и классы, задающие ограничения (NotBlank, Type).

В Симфони много готовых типов полей с разными опциями, и много классов-ограничений, потому тебе часто хватает их возможностей.
Ответы: >>1958132
Аноним 2021/03/05 11:27:59  №1958132 19
>>1958122
а я вчера такое накодил неработающее г-но
Ответы: >>1958148 >>1958199 >>1958220
Аноним 2021/03/05 12:18:19  №1958199 20
>>1958132
У тебя присвоение вместо сравнения
Ну и методы какие-то бессмысленные. Либо делай более общими, либо удаляй - тупо лишняя абстракция.
Ну и название check ни о чем не говорит, что она делает, какой тип вернет.
Еще косяк: ты создаешь форму, но не передаешь туда логин, хотя внутри методов проверяется логин этой формы, т.е. он у тебя пустой будет.

Крч перепиши это говно. Проще с нуля сделать, чем тут что-то править.
Ответы: >>1958204
Аноним 2021/03/05 12:24:24  №1958204 21
>>1958199
я сомневаюсь,что смогу это переписать в ООП стиле,тк херово понимаю это вреале,а не на учебных примерах про машины
Ответы: >>1958238 >>1958244
Аноним 2021/03/05 12:38:50  №1958238 22
>>1958204

А ты не хочешь порешать нашу задачу про ООП? У нас в шапке есть ссылка на учебник, там есть глава про ООП и задача про ООО Вектор. Можешь попробовать ее решить.

Также, есть задача про ООП-Гостиницу тут >>1939079

Есть задача про ООП-скидки: https://www.cyberforum.ru/php-oop/thread1459985.html

Попробуй их порешать. Или, если тебе не хочется уходить далеко от форм, попробуй спроектировать набор классов для работы с формами. Начни с краткого перечисления требований (какие возможности будут у твоей библиотеки), затем спроектируй классы, как они связаны и что представляют, и затем можешь писать код. Я выше давал примеры, как можно реализовать проверку форм с помощью ООП. В идеале ты должен получить набор кирпичиков, из которых можно собрать любую форму.



Ответы: >>1959315
Аноним 2021/03/05 15:01:46  №1958434 23
Ответы: >>1958465
Аноним 2021/03/05 15:48:52  №1958465 24
>>1958434

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

Завтра ты захочешь сделать, чтобы при ошибке выводилась форма с введенными значениями, и эту функцию придется переделывать. А вот если ее сделать, как я написал, то не придется.
Ответы: >>1958479
Аноним 2021/03/05 16:04:26  №1958479 25
val.jpg (47, 517x616)
616x517
Ответы: >>1958481 >>1958499
Аноним 2021/03/05 16:09:02  №1958481 26
>>1958479
> trim($login)
У тебя trim вникуда делается, сама переменная $login после trim останется неизменной. Нужно писать так $login = trim($login);

> if ($login==false)
Можно убрать строчку сверху и написать компактнее:
if (!checkLogin($login)) {
...
}
Ответы: >>1958496
Аноним 2021/03/05 16:18:04  №1958496 27
>>1958481
вот у меня еще есть 3 формы.
можно чтобы сокр код
сделать проверку этих форм через OR в одну строку
типа
if (!checkLogin($login) or !checkCountry(x) or !checkPassword(y)) {
не валидно }
Ответы: >>1958501
Аноним 2021/03/05 16:21:00  №1958501 28
>>1958496

Будет лучше написать единую функцию для проверки всех полей сразу. Чтобы она принимала на вход список полей и возвращала список ошибок в них.
Ответы: >>1958592
Аноним 2021/03/05 17:39:51  №1958592 29
>>1958501
не взлетела попытка
Ответы: >>1958648 >>1958867
Аноним 2021/03/06 07:46:18  №1958867 30
>>1958592

Ты зачем-то создаешь переменные, которые никак дальше не используются. Вот смотри:

function x() {
return $a = "текст";
}

Эта строка создает переменную $a, записывает в нее значение "текст", затем возвращает его и выходит из функции. При выходе из функции переменная $a уничтожается. Зачем ее тогда было создавать? Нужно писать просто:

return "текст";

У тебя команда

return $errors[] = "текст";

создает массив, но возвращает она не массив, а строку "текст". Зачем создается массив, непонятно, так как он никак не используется и уничтожается при выходе из функции. Если ты хотел вернуть массив из 1 элемента, то надо писать так:

return ["текст"];

Хотя правильнее было бы сначала собрать все ошибки в массив и в конце функции вернуть его:

$errors = [];
$errors[] = "текст";
$errors[] = "текст";
return $errors;

Также, функции надо называть осмысленно. Не form(), а check_form(), validate_form().

Ответы: >>1958871 >>1959068
Аноним 2021/03/06 13:28:40  №1959068 31
>>1958867
а как извлечь извлечь из функ,если return['$login','$country','$password','$email'];?
Ответы: >>1959079
Аноним 2021/03/06 13:38:39  №1959079 32
>>1959068

Не понял вопрос. Извлечь что? Если тебе надо извлечь значения из массива, то можно писать либо:

$login = $array[0];
$country = $array[1];

Либо

[$login, $country, $password ] = $array;

Ответы: >>1959087
Аноним 2021/03/06 13:42:18  №1959087 33
>>1959079
но это массив в функции,просто так его оттуда не достать
делать через list()?
Ответы: >>1959096
Аноним 2021/03/06 13:48:46  №1959096 34
Ответы: >>1959102
Аноним 2021/03/06 13:53:59  №1959102 35
>>1959096
вот здесь хрен знает какая попытка
рядом попытка в ООП
Ответы: >>1959111
Аноним 2021/03/06 14:00:59  №1959111 36
>>1959102

В функции последний if очень странный, смотри сам:

- если массив ошибок пуст (ошибок нет), вернуть пустой массив
- если ошибки есть, то не вернуть ошибки, а вернуть массив с 4 строчками (зачем?)

Нужно было просто написать return $error и все. Зачем написан этот if?

Справа, увы, не ООП, а просто код со словом class. У тебя все сделано статикой. То есть ты не можешь, например, создать 2 объекта для 2 разных форм. И опять же, у тебя все вперемешку - и проверка данных, и вывод результата сделан вместе. Это не ООП.
Ответы: >>1959263
Аноним 2021/03/06 16:20:18  №1959263 37
>>1959111
а так ООП?
вроде работает
Аноним 2021/03/06 17:19:46  №1959315 38
>>1959263

Нет. В ООП у каждого класса есть "зона ответственности", или какая-то роль, которую он выполняет. У тебя класс занимается и проверкой и выводом текста на экран. То есть, все смешано в кучу. Нужно разделять обязанности. Класс должен заниматься только проверкой. Выводом ошибок должен заниматься другой код.

Плюс, у тебя надо вручную вызывать каждую проверку. А правильнее сделать так, что ты вызываешь один метод validate() и он уже делает все нужные проверки и возвращает результат.

Вообще, чтобы разобраться в ООП, тебе стоило бы начать с более простых задач вроде тех, что перечислены тут >>1958238 → А то ты тыкаешься вслепую, пытаясь писать ООП код.

Также, научись форматировать код по PSR-1 и PSR-12. Если ты не можешь настроить плагин к редактору, то научись писать сразу с правильным форматированием. Во втором посте треда есть информация про форматирование кода. Я проверил - для VS Code частично помогает этот плагин: https://marketplace.visualstudio.com/items?itemName=kokororin.vscode-phpfmt

Ответы: >>1959399
Аноним 2021/03/06 19:53:10  №1959399 39
>>1959315
тыб ему просто про паттерный ооп написал солид, драй и тд, банду четырех пусть читнет.
мимокрестораб
Ответы: >>1960568
Аноним 2021/03/08 10:17:10  №1960568 40
>>1959901

Твой пост не похож на правду. Что значит "впервые вижу"? Ты что, препод и тебе есть с чем сравнивать? К тому же ты даже не знаешь сколько времени он потратил на изучение, а пишешь, про "так долго вникали". По моему, ты просто скучный тролль.

К тому же, основы кодинга - что какая команда делает - он как раз изучил. Ему нужны не основы, а учиться разбивать код на функции и тд. А для этого надо больше практиковаться и писать код.

>>1959399

Да не нужны тут никакие паттерны, чтобы форму проверить.

Ответы: >>1960606
Аноним 2021/03/08 11:00:51  №1960606 41
>>1960568
>Что значит "впервые вижу"? Ты что, препод и тебе есть с чем сравнивать?
Да, есть с чем сравнить. Видел многих вкатунов, и они явно получше соображают.

>К тому же ты даже не знаешь сколько времени он потратил на изучение, а пишешь, про "так долго вникали"
Ну вот он как минимум неделю пытается простой скриптик накидать. Причем не воспринимает ни слова, что ему пытаются сказать.

>К тому же, основы кодинга - что какая команда делает - он как раз изучил
Он соврешенно не понимает флоу кода, тупо рандомно вызывает встроенные функции и операторы

>Ему нужны не основы, а учиться разбивать код на функции и тд.
Ему нужны основы, он даже без функций код не может написать, или написать код одной функции
Ответы: >>1960615
Аноним 2021/03/08 11:09:57  №1960615 42
>>1960606
>он даже без функций код не может написать
код без функций? че?
Ответы: >>1960643
Аноним 2021/03/08 11:29:27  №1960643 43
>>1960615
Без своих функций, обычную лапшу
Ответы: >>1960670
Аноним 2021/03/08 11:39:38  №1960670 44
>>1960643
лапша это неструктурированный код, он может работать.