Каков правильный тип подсказки для массива объектов? [Дубликат]

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

var i, max, myStringArray = ["Hello","World"];
for (i = 0, max = myStringArray.length; i < max; i++) {
    alert(myStringArray[i]);
   //Do something
}

Если порядок итерации не имеет значения, вы должны попробовать обратный цикл, он быстрее, так как он уменьшает тестирование служебных данных и декремент в одном утверждении:

var i,myStringArray = ["item1","item2"];
for (i =  myStringArray.length; i--) {
    alert(myStringArray[i]);
}

или лучше и более чистый для использования во время цикла:

var myStringArray = ["item1","item2"],i = myStringArray.length;
while(i--) {
   // do something with fruits[i]
}
36
задан Marcin Nabiałek 14 December 2015 в 18:44
поделиться

3 ответа

Это не включено.

Если он не включен, есть ли у вас какие-либо подсказки, почему он не был включен, когда был добавлен тип hinting?

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

Это уже было предложено для PHP 5.6, но отклонено: RFC «arrayof» - интересно не из-за проблем с производительностью, которые оказались ничтожными, а потому, что не было соглашения как именно это должно быть реализовано. Было также возражение, что оно является неполным без подсказок скалярного типа. Если вы заинтересованы во всем обсуждении, прочитайте его в архиве списка рассылки .

Подсказки типа массива IMHO обеспечили бы большую выгоду вместе с типизированными массивами, и мне бы хотелось, чтобы см. их реализовано.

Итак, возможно, пришло время для нового RFC и возобновить это обсуждение.


Частичное обходное решение:

вы можете ввести подсказку переменные аргументы и, таким образом, записать подпись как

function findUserByAge(int $age, User ...$users) : array

Использование:

findUserByAge(15, ...$userInput);

В этом вызове аргумент $userInput будет «распакован» в отдельные переменные, а в сам метод «упакован» обратно в массив $users. Каждый элемент проверяется на тип User. $userInput также может быть итератором, он будет преобразован в массив.

К сожалению, подобного типа для возвращаемых типов не существует, и вы можете использовать его только для последнего аргумента.

59
ответ дан Fabian Schmengler 31 August 2018 в 13:37
поделиться

Поскольку массивы могут содержать смешанные значения, это невозможно.

Для этой цели вам необходимо использовать объекты / класс.

Вы можете создать класс, который будет управлять собственным массивом списка (частный / защищенный атрибут) и запретить добавлять другие значения в качестве рабочий стол для этой проблемы, если это действительно необходимо.

Однако ни один ответственный программист никогда не сломает намеченный шаблон, особенно если вы его прокомментируете правильно.

Экзапланирование:

Например, вы можете создать любой массив:

$myArray = array();

и добавить number:

$myArray[] = 1;

a строка:

$myArray[] = "abc123";

и объект

$myArray[] = new MyClass("some parameter", "and one more");

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

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

Было бы здорово с одной стороны, но с другой стороны медали вы потеряете некоторую способность смешать данные в массиве, которые могут иметь решающее значение для большого количества существующего кода и гибкости PHP может предложить.

Из-за смешанного контента, функции которого мы не хотим пропустить в PHP 7, невозможно набрать точное совпадение массива, как вы можете что-то вставить.

7
ответ дан Steini 31 August 2018 в 13:37
поделиться

Добавляем к тому, на что ответил Штеини.

Вы можете создать класс ObjectNIterator, который управляет вашим ObjectN и реализует Iterator: http://php.net/manual/en/class.iterator.php

Из методаN вызовите классMethodM, который возвращает заполненный ObjectNIterator, затем передайте эти данные методуO, который ожидает ObjectNIterator:

public function methodO(ObjectNIterator $objectNCollection)

2
ответ дан visualex 31 August 2018 в 13:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: