Сообщение от Белый шум
|
Нет такого правила, что ассоциативный массив обязан различать числа от строк с этим числом.
|
Однако в большинстве языков программирования (если говорить об ассоциативных массивах) такое различие делается, т. к. числа и строки — это разные типы.
А вот объект языка программирования (даже если говорить о языках с нестрогой типизацией), который можно рассматривать как коллекцию пар (строка, значение), как раз не делает различия между числом и строками с этим числом — происходит приведение имени свойства/поля/метода к строковому значению.
Сообщение от Белый шум
|
Для языков с нестрогой типизацией такое поведение является ожидаемым.
|
Совершенно нет! Просто вы путаете динамический объект/объект представляющий класс с ассоциативным массивом.
Сообщение от laimas
|
Ключ может быть либо типа integer, либо типа string. Значение может быть любого типа.
|
Ключ типа integer неявно приводится к строке, поскольку вы не можете использовать такой же ключ типа string. То, что вы описали — это объект языка программирования. Учитывая, что можно менять его свойства как угодно — это как dynamic object в C# или Object.create(null) в JS.
Сообщение от laimas
|
Дополнительно с ключом будут сделаны следующие преобразования:
|
Сообщение от laimas
|
т.е. дробная часть будет отброшена.
|
Сообщение от laimas
|
Тип bool также преобразовываются к типу integer.
|
Сообщение от laimas
|
Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей.
|
И как такое может называться ассоциативным массивом в PHP? Какое тут может быть соответствие одного значения (ключа) к другому значению, когда ключи безвозвратно утрачивают информацию, порождая коллизии?
Вот класс
DS\Map в PHP — это действительно работает как ассоциативный массив, имеет методы для работы с ним. (Также Map в JS, Dictionary в C#, HashMap в Java и пр.)
А то, что в PHP возвращает
array() — это даже не массив (некоторые там разглядели список, вектор, хэш-таблицу, словарь, коллекцию, стэк, очередь), а просто динамический объект, у которого даже нет своих методов для работы...
Этот
динамический объект можно расширять какими угодно свойствами, массивом он от этого не станет.
Этот динамический объект некоторым кажется массивом, однако стоит учитывать, что он таким кажется от того, что его передают в различные глобальные функции типа array_*, count и пр. которые имитируют работу этого т. н. «массива»/«ассоциативного массива»/«вектора» и пр.
Сообщение от laimas
|
Тоже самое будет и в JS, если var o = {1: 1, '1': 2}, то в результате будет одно свойство со значением 2.
|
Конечно — это же динамический объект, как array() в PHP.
Сообщение от Белый шум
|
Поддержка ассоциативных массивов есть во многих интерпретируемых языках программирования высокого уровня... PHP
|
Да, действительно есть!
<?php
$a = new DS\Map();
$a -> put(3, 1);
$a -> put('3', 2);
print_r($a);
// Ds\Map Object
// (
// [0] => Ds\Pair Object
// (
// [key] => 3
// [value] => 1
// )
// [1] => Ds\Pair Object
// (
// [key] => 3
// [value] => 2
// )
// )
print_r($a -> count());
// 2
Сообщение от Белый шум
|
обязан различать числа от строк с этим числом
|
Это вы наверное пристально вглядываетесь в вывод от print_r — он действительно не различает строки и числа, как в примере выше, но сами объекты правильного типа!