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

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

18.12.2025, 15:32. Показов 1263. Ответов 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
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 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
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
19.12.2025, 12:02
Лучший ответ Сообщение было отмечено Серибериешка как решение

Решение

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

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

Добавлено через 4 минуты
Если, вы не "впитали с молоком матери" подобное поведение, например изучая Си, смотрите документацию по присваиванию.
1
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
19.12.2025, 12:06  [ТС]
estic, ну тут понятно, что это просто знание данное, как истина, если брать знание приходящее, то даже зрительно - заполняется массив, ок, будем просто знать
0
Эксперт PHP
 Аватар для liris
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
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
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
19.12.2025, 23:45
Цитата Сообщение от Серибериешка Посмотреть сообщение
даже зрительно смущает возврат значения
Не знаю. Меня не смущает. Оператор присваивания возвращает то, что присваивали. Это база. Если знать этот факт, то смущения не вызывается.

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

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

Цитата Сообщение от Серибериешка Посмотреть сообщение
учившие меня когда-то люди, предлагали такую реализацию:
Эта реализация меня сильно смущает. У вас $route это переданный в метод аргумент. Почему у него сразу же стирается значение, заменяя его пустым объектом? И потом оно зачем-то возвращается...
1
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 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
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
20.12.2025, 10:39
Цитата Сообщение от ft4l Посмотреть сообщение
просто последовательность выаолнения операций возможно местами разная... как например такое))
Просто Перл сам решает, когда выполнять инкремент в списке. В Си такого нет.

В остальном согласен. Меня тоже резануло "не в С++".
1
 Аватар для volodin661
6793 / 2290 / 348
Регистрация: 10.12.2013
Сообщений: 7,899
20.12.2025, 17:12
Цитата Сообщение от estic Посмотреть сообщение
Просто Перл сам решает,
Да. Он(perl) смотрит какая погода, как колеблется доллар по отношению к юаню, да и Рождество скоро,
после чего принимает решение - инкрементировать или нет.
но это не точно.
1
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
20.12.2025, 19:01
Цитата Сообщение от volodin661 Посмотреть сообщение
Он(perl) смотрит какая погода, как колеблется доллар по отношению к юаню, да и Рождество скоро...
Ошибаетесь. Но доля неопределенности здесь действительно есть. Речь была о том, когда инкрементировать, а не о том, инкрементировать или нет. Это известная особенность Перла.
1
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
20.12.2025, 21:40
Цитата Сообщение от estic Посмотреть сообщение
известная особенность Перла
Perl и perl - это про лютые оптимизации и наибогатейший синтаксис.
Но да PHP в такой конструции, себя ведёт интуитивно понятнее.
... хотя можно и просто не стремиться как-то так выражать задуманное ))
1
Эксперт PHP
 Аватар для liris
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
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
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
20.12.2025, 23:53
Цитата Сообщение от Серибериешка Посмотреть сообщение
даже если эта переменная: заполняемый массив
я в первом ответе примерно изобразил ,))
что слева, по сути не массив, элемент массива,) ключ которого автоматически как крайнее свободное число.
1
Эксперт PHP
 Аватар для liris
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
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
6793 / 2290 / 348
Регистрация: 10.12.2013
Сообщений: 7,899
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru