«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/03/06 14:30:52  №1360209 1
Господа, вопросик.
Клонирую объект в свойстве которого лежит массив объектов. Правильно я понимаю, что объекты в массиве тож надо клонировать с помощью __clone()? Если да, то правильной ли будет вот такая функция:

function __clone()
{
\tforeach ($this->arrayWithObjects as $key => $object)
{
\t\t$this->arrayWithObjects[$key] = clone $object;
\t}
}
Ответы: >>1360214 >>1360530
Аноним 2019/03/06 14:38:41  №1360214 2
>>1360209
Ты ведь просто перезаписываешь объект, клонируя его. Какой смысл?
Ответы: >>1360216 >>1360530
Аноним 2019/03/06 14:45:23  №1360216 3
>>1360214
Потом мне нужно работать с этими объектами в массиве и изменять их, но так чтобы оригинальные не поменялись.
Ответы: >>1360353
Аноним 2019/03/06 18:08:04  №1360353 4
>>1360216
Ты в тот же самый массив записываешь тот же самый объект с тем же ключом. Какой смысл? Массив у тебя как был один, так и будет. Или ты все-таки в другой клонируешь?
Ответы: >>1360452
Аноним 2019/03/06 19:59:23  №1360452 5
>>1360353
В тот же массив я записываю клоны объектов, чтобы потом их изменять, без изменения оригинальных объектов.
Ответы: >>1360493
Аноним 2019/03/06 22:41:38  №1360493 6
>>1360452
Ты берешь и перезаписываешь оригинал его клонированной копией. Так понятно?

function __clone()
{
foreach (твойМассив как $ключ => $значение) {
твойМассив[$ключ] (текущий ключ форыча, - прим. автора) = clone $объект
}
}

Это равноценно такому

$arr = [0 => 'a', 1 => 'b'];
//первая итерация
foreach ($arr as 0 => 'a') {
$arr[0] = 'a';
}

То есть форыч берет и перезаписывает значение на то же самое. Чтобы работать с копиями, тебе необходимо положить их в новый массив.
Аноним 2019/03/07 03:57:39  №1360530 7
>>1360209

Да, ты правильно понял. По умолчанию при клонировании поля объекта копируются их оригинала в клон. Если в поле массив - то создается новая копия массива, но объекты внутри массива не клонируются - копируются просто указатели на них (ты можешь это увидеть с помощью var_dump, который выводит уникальный номер объекта).

>>1360214

Смысл в том, что когда мы клонируем объект и у него есть поле с массивом объектов, мы хотим сделать независимые копии этих объектов.

>>1360386

Тут есть 2 подхода. Статический и динамический.

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

Их можно генерировать 2 способами:

- сделать скрипт, который выбирает все записи из БД, обходит их циклом, для каждой генерирует страницу, а в конце генерирует оглавление. Такой скрипт удобнее запускать из ком. строки, так как он может долго работать.

- можно при добавлении знаменитости генерировать страницу с ней и класть в папку, а также перегенерировать оглавление. Это должно быть недолго, и это можно сделать в скрипте обновления БД, только вынеси это в отдельные функции.

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

Есть и другой подход - динамический. При нем мы не храним HTML на диске вообще. Мы генерируем HTML-страницу знаменитости или оглавление на лету, когда пользователь ее попросит, и не сохраняем ее никуда. То есть когда пользователь заходит по адресу /celeb.php?id=123 (адрес можно будет поменять), то запускается скрипт, берет информацию о знаменитости 123, подставляет ее в шаблон и отдает получившийся HTML пользователю. Аналогично делается оглавление.

Плюс динамического сайта - то, что не надо ничего обновлять при добавлении или изменении информации, и что изменения в БД мгновенно отображаются на сайте. Плюс статического сайта - скорость работы, в десятки-сотни раз выше, чем у динамического. Минус статического сайта - по мере роста объема информации обновление занимает больше времени. Представь, что у тебя оглавление содержит 20 знаменитостей на страницу, а всего знаменитостей миллион. При добавлении новой тебе придется обновлять все 50 000 страниц оглавления.

Почитать про шаблоны можно тут: https://github.com/codedokode/pasta/blob/master/php/templates.md

Почитать про архитектуру MVC (для динамической генерации страниц) можно тут: https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Наконец, у нас есть задача сделать список студентов - и в ней есть очень много комментариев, которые подойдут и тебе: https://github.com/codedokode/pasta/blob/master/student-list.md

> Подскажите, как можно обозначить вот эти элементы страницы любого саба на Reddit (pic related)?

Посты, записи.

> на той же странице написал PHP скрипт, который пользуется переменными из $_GET для составления SQL INSERT INTO.

Прочитай обязательно про инъекции: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

> Затем будет стоять задача построить механизм фильтрации по атрибутам (first_name, last_name, occupation, location, etc.) при поиске на сайте.

Это надо делать динамически, то есть при получении запроса из формы поиска ты должен сформулировать SQL запрос с условиями, выбрать знаменитостей из БД, сформировать HTML страницу и отправить пользователю.

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