С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65

Почему заполнение массива объектом возвращает не массив, но помещаемый в массив - объект?

18.12.2025, 15:32. Показов 1072. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class RouteCollector
{
    private array $routes = [];
 
    /**
     * @return list<Route>
     */
    public function getRoutes(): array
    {
        return $this->routes;
    }
 
    public function add(string $pattern, string $action, array $methods = []): Route
    {
        return $this->addRoute(new Route($pattern, $action, $methods));
    }
 
    public function addRoute(Route $route): Route
    {
        return $this->routes[] = $route;
    }
 
    public function get(string $pattern, string $action): Route
    {
        return $this->addRoute(new Route($pattern, $action, [__FUNCTION__]));
    }
}
 
$routeCollector = new RouteCollector();
 
$routeCollector->get('/page_1', 'Action_1')
    ->addMiddleware('Middleware_1')
    ->addMiddleware('Middleware_2');
 
$routeCollector->get('/page_2', 'Action_2')
    ->addMiddleware('Middleware_3')
    ->addMiddleware('Middleware_4');
 
var_dump($routeCollector->getRoutes());
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
array (size=2)
  0 => 
    object(Core\Services\Routing\Route)[2]
      private array 'middleware' => 
        array (size=2)
          0 => string 'Middleware_1' (length=12)
          1 => string 'Middleware_2' (length=12)
      private readonly string 'pattern' => string '/page_1' (length=7)
      private readonly string 'action' => string 'Action_1' (length=8)
      private array 'methods' => 
        array (size=1)
          0 => string 'GET' (length=3)
  1 => 
    object(Core\Services\Routing\Route)[3]
      private array 'middleware' => 
        array (size=2)
          0 => string 'Middleware_3' (length=12)
          1 => string 'Middleware_4' (length=12)
      private readonly string 'pattern' => string '/page_2' (length=7)
      private readonly string 'action' => string 'Action_2' (length=8)
      private array 'methods' => 
        array (size=1)
          0 => string 'GET' (length=3)
Почему метод RouteCollector::addRoute возвращает объект?

Разве он не должен вернуть заполняемый массив?

Я ещё понимаю если бы было так:

PHP
1
2
3
4
5
6
public function addRoute(Route $route): Route
{
    $this->routes[] = $route;
 
    return $route;
}
Поясните убогому.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2025, 15:32
Ответы с готовыми решениями:

Почему в одном случае возвращается массив, в другом объект?
Добрый день! Пишу api выдачи данных для графиков в приложении... Должно выводить в json...

mysqli_insert_id не возвращает ID вставленной записи, постоянно возвращает "1".
Есть запрос такой расчитываю через insert_id получить id добавленной книги, но почему-то возвращает...

MySQLi почему-то возвращает странный ассоциативный массив
Добрый день, не могу понять в чем ошибка, вот код &lt;?php class model { private $db; ...

24
Невнимательный
 Аватар для ft4l
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,421
Записей в блоге: 2
18.12.2025, 16:24
Лучший ответ Сообщение было отмечено Серибериешка как решение

Решение

Цитата Сообщение от Серибериешка Посмотреть сообщение
Разве он не должен вернуть заполняемый массив?
Нет, всё правильно. Выполняется присвоение объекта, и возвращает его,
Создание/модификация с помощью синтаксиса квадратных скобок

Существующий массив может быть изменён путём явной установкой значений в нем.
Это выполняется присвоением значений массиву (array) с указанием в скобках ключа. Кроме того, ключ можно опустить, в результате получится пустая пара скобок ([]).
PHP
1
2
3
4
    $arr[key] = value;
    $arr[] = value;
    // key может быть int или string
    // value может быть любым значением любого типа
Если массив $arr ещё не существует или для него задано значение null или false, он будет создан.
1
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
18.12.2025, 16:47  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
Выполняется присвоение объекта, и возвращает его
блин даже зрительно так не кажется
0
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
19.12.2025, 11:29  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
Выполняется присвоение объекта
вот присвоение:

PHP
1
$a = 1; // переменная $a равнa 1
а вот заполнение массива:

PHP
1
$a[] = 1; // массив $a[] не равен 1, просто у него по ключу 0 значение - 1
return $a = 1; возвращает присвоенное значение 1, так как ему и равна переменная $a

return $a[] = 1; не должно возвращать присвоенное значение 1, так как для его получения нужно выполнить return $a[0], а вообще на самом деле мы всего лишь заполнили массив

Поэтому логика не очень понятна, как это поясняет документация, я - не нашёл.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
19.12.2025, 12:02
Лучший ответ Сообщение было отмечено Серибериешка как решение

Решение

Цитата Сообщение от Серибериешка Посмотреть сообщение
Поэтому логика не очень понятна, как это поясняет документация, я - не нашёл.
Все предельно логично. Результатом присваивания является присваиваемое значение.

Нелогично ожидать массив, когда что-то присваиваете его отдельному элементу.

Добавлено через 4 минуты
Если, вы не "впитали с молоком матери" подобное поведение, например изучая Си, смотрите документацию по присваиванию.
1
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
19.12.2025, 12:06  [ТС]
estic, ну тут понятно, что это просто знание данное, как истина, если брать знание приходящее, то даже зрительно - заполняется массив, ок, будем просто знать
0
Эксперт PHP
 Аватар для liris
4375 / 1015 / 154
Регистрация: 16.01.2023
Сообщений: 2,514
19.12.2025, 13:56
Лучший ответ Сообщение было отмечено Серибериешка как решение

Решение

Цитата Сообщение от Серибериешка Посмотреть сообщение
что это просто знание данное, как истина
Это поведение, специально заложенное в язык и описанное в документации (и в большинстве учебников по языку):

Результатом выполнения оператора присваивания будет само присвоенное значение.
https://www.php.net/manual/ru/... gnment.php

Если вы хотите, чтобы у вас вернулся весь массив, то его и нужно возвращать:

PHP
1
2
3
4
5
public function addRoute(Route $route): Route
    {
        $this->routes[] = $route;
        return $this->routes;
    }
Но гораздо полезнее возвращать весь объект, чтобы можно было использовать цепочку вызовов, например. В таком виде непонятно, зачем там вообще что-то возвращать.
1
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
19.12.2025, 14:10  [ТС]
Цитата Сообщение от liris Посмотреть сообщение
возвращать весь объект, чтобы можно было использовать цепочку вызовов
так и сделано

Цитата Сообщение от liris Посмотреть сообщение
непонятно, зачем там вообще что-то возвращать
чтобы иметь доступ к методам объекта, помещённого в массив

вопрос БЫЛ не по реализации, вопрос БЫЛ в том, что даже зрительно смущает возврат значения, но не массива, даже если читать код, то получаем: возвращаем массив, заполняемый значением

+ ко всему, учившие меня когда-то люди, предлагали такую реализацию:

PHP
1
2
3
4
5
6
public function addRoute(Route $route): Route
{
    $this->routes[] = $route = new Route();
 
    return $route;
}
поэтому из-за этого тоже возник такой вопрос
0
Эксперт PHP
 Аватар для liris
4375 / 1015 / 154
Регистрация: 16.01.2023
Сообщений: 2,514
19.12.2025, 23:45
Цитата Сообщение от Серибериешка Посмотреть сообщение
даже зрительно смущает возврат значения
Не знаю. Меня не смущает. Оператор присваивания возвращает то, что присваивали. Это база. Если знать этот факт, то смущения не вызывается.

Попробуйте со своим смущением посмотреть на такой пример:

PHP
1
$a = $b = 3;
В некоторых других языках тоже схожее поведение наблюдается. Например в C# оператор присваивания тоже возвращает присвоенное значение (но не в С++).

Цитата Сообщение от Серибериешка Посмотреть сообщение
учившие меня когда-то люди, предлагали такую реализацию:
Эта реализация меня сильно смущает. У вас $route это переданный в метод аргумент. Почему у него сразу же стирается значение, заменяя его пустым объектом? И потом оно зачем-то возвращается...
1
Невнимательный
 Аватар для ft4l
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,421
Записей в блоге: 2
20.12.2025, 05:11
Цитата Сообщение от liris Посмотреть сообщение
не в С++
просто последовательность выаолнения операций возможно местами разная... как например такое))
Windows Batch file
1
2
3
4
5
6
7
php -r "$s= 4; echo phpversion(), PHP_EOL, ' ', $s, ' ', ++$s, ' ', $s++, ' ', $s, PHP_EOL; "
8.2.21
 4 5 5 6
 
perl -e "$s= 4; print $^V, $/, ' ', $s, ' ', ++$s, ' ', $s++, ' ', $s, $/; "
v5.32.1
 6 6 5 6
А так вроде без перезагрузки операторов должно быть всё как в Си
2
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
20.12.2025, 10:39
Цитата Сообщение от ft4l Посмотреть сообщение
просто последовательность выаолнения операций возможно местами разная... как например такое))
Просто Перл сам решает, когда выполнять инкремент в списке. В Си такого нет.

В остальном согласен. Меня тоже резануло "не в С++".
1
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,829
20.12.2025, 17:12
Цитата Сообщение от estic Посмотреть сообщение
Просто Перл сам решает,
Да. Он(perl) смотрит какая погода, как колеблется доллар по отношению к юаню, да и Рождество скоро,
после чего принимает решение - инкрементировать или нет.
но это не точно.
1
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
20.12.2025, 19:01
Цитата Сообщение от volodin661 Посмотреть сообщение
Он(perl) смотрит какая погода, как колеблется доллар по отношению к юаню, да и Рождество скоро...
Ошибаетесь. Но доля неопределенности здесь действительно есть. Речь была о том, когда инкрементировать, а не о том, инкрементировать или нет. Это известная особенность Перла.
1
Невнимательный
 Аватар для ft4l
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,421
Записей в блоге: 2
20.12.2025, 21:40
Цитата Сообщение от estic Посмотреть сообщение
известная особенность Перла
Perl и perl - это про лютые оптимизации и наибогатейший синтаксис.
Но да PHP в такой конструции, себя ведёт интуитивно понятнее.
... хотя можно и просто не стремиться как-то так выражать задуманное ))
1
Эксперт PHP
 Аватар для liris
4375 / 1015 / 154
Регистрация: 16.01.2023
Сообщений: 2,514
20.12.2025, 21:41
Цитата Сообщение от ft4l Посмотреть сообщение
просто последовательность выаолнения операций возможно местами разная...
В С++ не могу однозначно заявлять, потому что операторы могут быть перегружены (в том числе оператор присваивания). Не помню уже подробности, но вроде там при присваивании объекты копируются (в то время как в PHP копируется ссылка на объект). Хотя могу и наврать. Давно С++ не щупал.
1
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
20.12.2025, 23:35  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
как колеблется доллар по отношению к юаню
доллар и юань вообще никак не колебают и не должны колебать того, кто сколько и кому отгрузил два раза, так по Указу Президента от 1 апреля (День смеха) 2022 года продажа энергоресурсов производится за рубли, то, что эта продажа должна производиться за конвертацию бумаги в рубли - там не написано, поэтому покупка бумаги за рубли и отгрузка энергоресурсов есть - двойная отгрузка товара, потому что если у покупателя нет рублей, то он должен продавать за рубли, чтобы они у него были, в если их у него нет, то продавец ему должен дать в долг рубли на 5 лет под 20%, чтобы к моменту выплаты долга он столько же был должен

скорее не по теме поэтому удаляем растяжимые понятия о жизни

Добавлено через 3 минуты
estic, я там в примеры запихивал (копипастил) метод, в который передаётся уже готовый параметр, сори, я как бы про реализацию без входного параметра, вопрос решён: возвращаемая переменная вернёт присваиваемое значение намертво, возвращаемый вроде как массив, которому присваивается значение - вернёт присваиваемое значение

порешали

Добавлено через 2 минуты
Цитата Сообщение от liris Посмотреть сообщение
Почему у него сразу же стирается значение
подразумевалось без передачи - я тупанул

Добавлено через 58 минут
estic, сейчас нет времени
Цитата Сообщение от estic Посмотреть сообщение
Но доля неопределенности здесь действительно есть
именно это и нарушает логику ВОСПРИЯТИЯ

забили: присваиваемое переменной значение, даже если эта переменная: заполняемый массив, вернёт - присваиваемое значение

ВОПРОС РЕШЁН, если он когда-то не будет высмеян и логика будет приведена к логике

Добавлено через 3 минуты
Цитата Сообщение от ft4l Посмотреть сообщение
последовательность выаолнения
да, именно это режет глаз грубо говоря, меня не смущает возврат ПЕРЕМЕННОЙ с присваиваемым значением, меня смущает возврат ЗАПОЛНЯЕМОГО МАССИВА, я не воспринимаю такую логику, как возврат значения, с каноном не спорю, но это скорее косяк разрабов ЯП
0
Невнимательный
 Аватар для ft4l
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,421
Записей в блоге: 2
20.12.2025, 23:53
Цитата Сообщение от Серибериешка Посмотреть сообщение
даже если эта переменная: заполняемый массив
я в первом ответе примерно изобразил ,))
что слева, по сути не массив, элемент массива,) ключ которого автоматически как крайнее свободное число.
1
Эксперт PHP
 Аватар для liris
4375 / 1015 / 154
Регистрация: 16.01.2023
Сообщений: 2,514
21.12.2025, 02:55
Цитата Сообщение от Серибериешка Посмотреть сообщение
да, именно это режет глаз грубо говоря
Просто выражения с присваиванием нужно читать справа налево. Просто потому что так заведено уже не одно десятилетие.

При выражении:

PHP
1
$a = $b = 13 + 2;
Сначала будет вычислено значение 13 + 2 (вернется значение 15). Это первое действие.
Потом выполнится операция $b = 15 (вернется значение 15). Это второе действие.
Потом выполнится операция $a = 15 (вернется значение 15, но это уже не важно, т.к. возвращать некуда). Это третье действие.

Это вполне привычное явление для си-подобных языков. В С++ аналогично (языку, на секундочку, больше 40 лет уже):
https://metanit.com/cpp/tutorial/2.9.php
1
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
21.12.2025, 05:30  [ТС]
Цитата Сообщение от liris Посмотреть сообщение
выражения с присваиванием нужно читать справа налево
а теперь просто верните заполняемый массив)))

НЕ ПЕРЕМЕННУЮ С ПРИСВОЕННЫМ значением, но ЗАПОЛНЯЕМЫЙ МАССИВ



Добавлено через 1 минуту
ладно, надеюсь все поняли суть да дело, расходимся, благодарю за уделённое внимание
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,829
22.12.2025, 18:45
Цитата Сообщение от ft4l Посмотреть сообщение
Perl и perl - это про лютые оптимизации и наибогатейший синтаксис.
Bash
1
raku -e 'my $s= 4; say $s, " ", ++$s, " ", $s++, " ", $s'   # 6 5 5 6
а вот ИИ здесь жидко облажался:
Код на Raku my $s = 4; say $s, " ", ++$s, " ", $s++, " ", $s выведет 4 5 5 6, потому что ++$s (префиксный инкремент) увеличивает $s до 5 передиспользованием, $s++ (постфиксный инкремент) использует текущее значение (5), а затем увеличивает, и последняя $s печатает уже увеличенное значение (6). 
Дело в том, что оператор запятая между $a $b $c в выражении say $a, $b, $c - это не перечисление, как в Perl, a список. Полегче стало. И никакого Undefined Behavior
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2025, 18:45
Помогаю со студенческими работами здесь

substr_count() - всегда возвращает 0. Почему? (Код в теме)
Почему $bank всегда = 0? И есть ли альтернативные способы решения такой задачи? &lt;? $asdban =...

почему mysql_fetch_array возвращает два значения а не четыре?
имеется mysql-таблица table, с полями: id и name. $v=mysql_query(&quot;select * from table&quot;);...

Почему MySql всегда true возвращает?
tml&gt; &lt;title&gt;Регистрация&lt;/title&gt; &lt;body&gt; Форма для регистрации&lt;br&gt; &lt;form&gt; &lt;input...

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

Почему не приходит письмо на почту, хотя обработчик не возвращает ошибку?
Имеется обработчик формы MailHandler.php, который возвращает mail sent, но письмо на почту не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru