Введите вывод подсказок в PHP 7 - массив объектов

Возможно, я отсутствовал почти там, какая-либо опция состоит в том, чтобы определить ту функцию, должен иметь аргумент или возврат, например, массив Пользовательских объектов?

Рассмотрите следующий код:

<?php

class User
{
    protected $name;

    protected $age;

    /**
     * User constructor.
     *
     * @param $name
     */
    public function __construct(string $name, int $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    /**
     * @return mixed
     */
    public function getName() : string
    {
        return $this->name;
    }

    public function getAge() : int
    {
        return $this->age;
    }
}

function findUserByAge(int $age, array $users) : array
{
    $result = [];
    foreach ($users as $user) {
        if ($user->getAge() == $age) {
            if ($user->getName() == 'John') {
                // complicated code here
                $result[] = $user->getName(); // bug
            } else {
                $result[] = $user;
            }
        }
    }

    return $result;
}

$users = [
    new User('John', 15),
    new User('Daniel', 25),
    new User('Michael', 15),
];

$matches = findUserByAge(15, $users);

foreach ($matches as $user) {
    echo $user->getName() . ' '.$user->getAge() . "\n";
}

Есть ли любая опция в PHP7 для сообщения функции findUserByAge должен возвращаемый массив пользователей? Я ожидал бы, что, когда вывод подсказок типа был добавлен, это должно быть возможно, но я не нашел информации для типа, подсказывающего для массива объектов так, вероятно, это не включено в PHP 7. Если это не включено, у Вас есть Какая-либо подсказка, почему это не было включено, когда вывод подсказок типа был добавлен?

59
задан 14 December 2015 в 20:44

2 ответа

В нашей кодовой базе у нас есть понятие наборов. Они основаны на классе под названием TypedArray, который основан на ArrayObject.

class ArrayObject extends \ArrayObject
{
    /**
     * Clone a collection by cloning all items.
     */
    public function __clone()
    {
        foreach ($this as $key => $value) {
            $this[$key] = is_object($value) ? clone $value : $value;
        }
    }

    /**
     * Inserting the provided element at the index. If index is negative, it will be calculated from the end of the Array Object
     *
     * @param int $index
     * @param mixed $element
     */
    public function insert(int $index, $element)
    {
        $data = $this->getArrayCopy();
        if ($index < 0) {
            $index = $this->count() + $index;
        }

        $data = array_merge(array_slice($data, 0, $index, true), [$element], array_slice($data, $index, null, true));
        $this->exchangeArray($data);
    }

    /**
     * Remove a portion of the array and optionally replace it with something else.
     *
     * @see array_splice()
     *
     * @param int $offset
     * @param int|null $length
     * @param null $replacement
     *
     * @return static
     */
    public function splice(int $offset, int $length = null, $replacement = null)
    {
        $data = $this->getArrayCopy();

        // A null $length AND a null $replacement is not the same as supplying null to the call.
        if (is_null($length) && is_null($replacement)) {
            $result = array_splice($data, $offset);
        } else {
            $result = array_splice($data, $offset, $length, $replacement);
        }
        $this->exchangeArray($data);

        return new static($result);
    }

    /**
     * Adding a new value at the beginning of the collection
     *
     * @param mixed $value
     *
     * @return int Returns the new number of elements in the Array
     */
    public function unshift($value): int
    {
        $data = $this->getArrayCopy();
        $result = array_unshift($data, $value);
        $this->exchangeArray($data);

        return $result;
    }

    /**
     * Extract a slice of the array.
     *
     * @see array_slice()
     *
     * @param int $offset
     * @param int|null $length
     * @param bool $preserveKeys
     *
     * @return static
     */
    public function slice(int $offset, int $length = null, bool $preserveKeys = false)
    {
        return new static(array_slice($this->getArrayCopy(), $offset, $length, $preserveKeys));
    }

    /**
     * Sort an array.
     *
     * @see sort()
     *
     * @param int $sortFlags
     *
     * @return bool
     */
    public function sort($sortFlags = SORT_REGULAR)
    {
        $data = $this->getArrayCopy();
        $result = sort($data, $sortFlags);
        $this->exchangeArray($data);

        return $result;
    }

    /**
     * Apply a user supplied function to every member of an array
     *
     * @see array_walk
     *
     * @param callable $callback
     * @param mixed|null $userData
     *
     * @return bool Returns true on success, otherwise false
     *
     * @see array_walk()
     */
    public function walk($callback, $userData = null)
    {
        $data = $this->getArrayCopy();
        $result = array_walk($data, $callback, $userData);
        $this->exchangeArray($data);

        return $result;
    }

    /**
     * Chunks the object into ArrayObject containing
     *
     * @param int $size
     * @param bool $preserveKeys
     *
     * @return ArrayObject
     */
    public function chunk(int $size, bool $preserveKeys = false): ArrayObject
    {
        $data = $this->getArrayCopy();
        $result = array_chunk($data, $size, $preserveKeys);

        return new ArrayObject($result);
    }

    /**
     * @see array_column
     *
     * @param mixed $columnKey
     *
     * @return array
     */
    public function column($columnKey): array
    {
        $data = $this->getArrayCopy();
        $result = array_column($data, $columnKey);

        return $result;
    }

    /**
     * @param callable $mapper Will be called as $mapper(mixed $item)
     *
     * @return ArrayObject A collection of the results of $mapper(mixed $item)
     */
    public function map(callable $mapper): ArrayObject
    {
        $data = $this->getArrayCopy();
        $result = array_map($mapper, $data);

        return new self($result);
    }

    /**
     * Applies the callback function $callable to each item in the collection.
     *
     * @param callable $callable
     */
    public function each(callable $callable)
    {
        foreach ($this as &$item) {
            $callable($item);
        }
        unset($item);
    }

    /**
     * Returns the item in the collection at $index.
     *
     * @param int $index
     *
     * @return mixed
     *
     * @throws InvalidArgumentException
     * @throws OutOfRangeException
     */
    public function at(int $index)
    {
        $this->validateIndex($index);

        return $this[$index];
    }

    /**
     * Validates a number to be used as an index
     *
     * @param int $index The number to be validated as an index
     *
     * @throws OutOfRangeException
     * @throws InvalidArgumentException
     */
    private function validateIndex(int $index)
    {
        $exists = $this->indexExists($index);

        if (!$exists) {
            throw new OutOfRangeException('Index out of bounds of collection');
        }
    }

    /**
     * Returns true if $index is within the collection's range and returns false
     * if it is not.
     *
     * @param int $index
     *
     * @return bool
     *
     * @throws InvalidArgumentException
     */
    public function indexExists(int $index)
    {
        if ($index < 0) {
            throw new InvalidArgumentException('Index must be a non-negative integer');
        }

        return $index < $this->count();
    }

    /**
     * Finding the first element in the Array, for which $callback returns true
     *
     * @param callable $callback
     *
     * @return mixed Element Found in the Array or null
     */
    public function find(callable $callback)
    {
        foreach ($this as $element) {
            if ($callback($element)) {
                return $element;
            }
        }

        return null;
    }

    /**
     * Filtering the array by retrieving only these elements for which callback returns true
     *
     * @param callable $callback
     * @param int $flag Use ARRAY_FILTER_USE_KEY to pass key as the only argument to $callback instead of value.
     *                  Use ARRAY_FILTER_USE_BOTH pass both value and key as arguments to $callback instead of value.
     *
     * @return static
     *
     * @see array_filter
     */
    public function filter(callable $callback, int $flag = 0)
    {
        $data = $this->getArrayCopy();
        $result = array_filter($data, $callback, $flag);

        return new static($result);
    }

    /**
     * Reset the array pointer to the first element and return the element.
     *
     * @return mixed
     *
     * @throws \OutOfBoundsException
     */
    public function first()
    {
        if ($this->count() === 0) {
            throw new \OutOfBoundsException('Cannot get first element of empty Collection');
        }

        return reset($this);
    }

    /**
     * Reset the array pointer to the last element and return the element.
     *
     * @return mixed
     *
     * @throws \OutOfBoundsException
     */
    public function last()
    {
        if ($this->count() === 0) {
            throw new \OutOfBoundsException('Cannot get last element of empty Collection');
        }

        return end($this);
    }

    /**
     * Apply a user supplied function to every member of an array
     *
     * @see array_reverse
     *
     * @param bool $preserveKeys
     *
     * @return static
     */
    public function reverse(bool $preserveKeys = false)
    {
        return new static(array_reverse($this->getArrayCopy(), $preserveKeys));
    }

    public function keys(): array
    {
        return array_keys($this->getArrayCopy());
    }

    /**
     * Use a user supplied callback to reduce the array to a single member and return it.
     *
     * @param callable $callback
     * @param mixed|null $initial
     *
     * @return mixed
     */
    public function reduce(callable $callback, $initial = null)
    {
        return array_reduce($this->getArrayCopy(), $callback, $initial);
    }
}

и

/**
 * Class TypedArray
 *
 * This is a typed array
 *
 * By enforcing the type, you can guarantee that the content is safe to simply iterate and call methods on.
 */
abstract class AbstractTypedArray extends ArrayObject
{
    use TypeValidator;

    /**
     * Define the class that will be used for all items in the array.
     * To be defined in each sub-class.
     */
    const ARRAY_TYPE = null;

    /**
     * Array Type
     *
     * Once set, this ArrayObject will only accept instances of that type.
     *
     * @var string $arrayType
     */
    private $arrayType = null;

    /**
     * Constructor
     *
     * Store the required array type prior to parental construction.
     *
     * @param mixed[] $input Any data to preset the array to.
     * @param int $flags The flags to control the behaviour of the ArrayObject.
     * @param string $iteratorClass Specify the class that will be used for iteration of the ArrayObject object. ArrayIterator is the default class used.
     *
     * @throws InvalidArgumentException
     */
    public function __construct($input = [], $flags = 0, $iteratorClass = ArrayIterator::class)
    {
        // ARRAY_TYPE must be defined.
        if (empty(static::ARRAY_TYPE)) {
            throw new \RuntimeException(
                sprintf(
                    '%s::ARRAY_TYPE must be set to an allowable type.',
                    get_called_class()
                )
            );
        }

        // Validate that the ARRAY_TYPE is appropriate.
        try {
            $this->arrayType = $this->determineType(static::ARRAY_TYPE);
        } catch (\Collections\Exceptions\InvalidArgumentException $e) {
            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
        }

        // Validate that the input is an array or an object with an Traversable interface.
        if (!(is_array($input) || (is_object($input) && in_array(Traversable::class, class_implements($input))))) {
            throw new InvalidArgumentException('$input must be an array or an object that implements \Traversable.');
        }

        // Create an empty array.
        parent::__construct([], $flags, $iteratorClass);

        // Append each item so to validate it's type.
        foreach ($input as $key => $value) {
            $this[$key] = $value;
        }
    }

    /**
     * Adding a new value at the beginning of the collection
     *
     * @param mixed $value
     *
     * @return int Returns the new number of elements in the Array
     *
     * @throws InvalidArgumentException
     */
    public function unshift($value): int
    {
        try {
            $this->validateItem($value, $this->arrayType);
        } catch (\Collections\Exceptions\InvalidArgumentException $e) {
            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
        }

        return parent::unshift($value);
    }

    /**
     * Check the type and then store the value.
     *
     * @param mixed $offset The offset to store the value at or null to append the value.
     * @param mixed $value The value to store.
     *
     * @throws InvalidArgumentException
     */
    public function offsetSet($offset, $value)
    {
        try {
            $this->validateItem($value, $this->arrayType);
        } catch (\Collections\Exceptions\InvalidArgumentException $e) {
            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
        }

        parent::offsetSet($offset, $value);
    }

    /**
     * Sort an array, taking into account objects being able to represent their sortable value.
     *
     * {@inheritdoc}
     */
    public function sort($sortFlags = SORT_REGULAR)
    {
        if (!in_array(SortableInterface::class, class_implements($this->arrayType))) {
            throw new \RuntimeException(
                sprintf(
                    "Cannot sort an array of '%s' as that class does not implement '%s'.",
                    $this->arrayType,
                    SortableInterface::class
                )
            );
        }
        // Get the data from
        $originalData = $this->getArrayCopy();
        $sortableData = array_map(
            function (SortableInterface $item) {
                return $item->getSortValue();
            },
            $originalData
        );

        $result = asort($sortableData, $sortFlags);

        $order = array_keys($sortableData);
        uksort(
            $originalData,
            function ($key1, $key2) use ($order) {
                return array_search($key1, $order) <=> array_search($key2, $order);
            }
        );

        $this->exchangeArray($originalData);

        return $result;
    }

    /**
     * {@inheritdoc}
     */
    public function filter(callable $callback, int $flag = 0)
    {
        if ($flag == ARRAY_FILTER_USE_KEY) {
            throw new InvalidArgumentException('Cannot filter solely by key. Use ARRAY_FILTER_USE_BOTH and amend your callback to receive $value and $key.');
        }

        return parent::filter($callback, $flag);
    }
}

использование в качестве примера.

class PaymentChannelCollection extends AbstractTypedArray
{
    const ARRAY_TYPE = PaymentChannel::class;
}

Вы можете теперь typehint с PaymentChannelCollection и быть уверенными, что у Вас есть набор PaymentChannels (например).

Часть кода может назвать исключения в нашем пространстве имен. Я думаю, что существует блок проверки допустимости типа также от danielgsims/php-collections (мы первоначально использовали те наборы, но имели проблемы вокруг гибкости их - они хороши, просто не для нас - поэтому, возможно, смотрят на них так или иначе!).

3
ответ дан 1 November 2019 в 12:17

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

/**
 * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

function doFoo(array 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

/**
 * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

class Foo{}

class NotFoo{}

class Bar{
    /**
     * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos Foo[] */ public function doFoo(array

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos,

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2) {return (function(Foo ...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos) use(

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2){ return

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2; })(...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos);} } $myBar = new Bar(); $arrayOfFoo = array(new Foo(), new Foo(), new Foo()); $notArrayOfFoo = array(new Foo(), new NotFoo(), new Foo()); echo $myBar->doFoo($arrayOfFoo, 'Success'); // Success echo $myBar->doFoo($notArrayOfFoo, 'Success'); // Uncaught TypeError: Argument 2 passed to Bar::{closure}() must be an instance of Foo, instance of NotFoo given...

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos Foo[] <- An array of type Foo */

Вот пример OO:

class Foo{}

class NotFoo{}

class Bar{
    /**
     * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos Foo[] */ public function doFoo(array

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos,

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2) {return (function(Foo ...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos) use(

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2){ return

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2; })(...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos);} } $myBar = new Bar(); $arrayOfFoo = array(new Foo(), new Foo(), new Foo()); $notArrayOfFoo = array(new Foo(), new NotFoo(), new Foo()); echo $myBar->doFoo($arrayOfFoo, 'Success'); // Success echo $myBar->doFoo($notArrayOfFoo, 'Success'); // Uncaught TypeError: Argument 2 passed to Bar::{closure}() must be an instance of Foo, instance of NotFoo given...

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos) { return (function(Foo ...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

/**
 * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

class Foo{}

class NotFoo{}

class Bar{
    /**
     * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos Foo[] */ public function doFoo(array

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos,

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2) {return (function(Foo ...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos) use(

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2){ return

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

param2; })(...

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos);} } $myBar = new Bar(); $arrayOfFoo = array(new Foo(), new Foo(), new Foo()); $notArrayOfFoo = array(new Foo(), new NotFoo(), new Foo()); echo $myBar->doFoo($arrayOfFoo, 'Success'); // Success echo $myBar->doFoo($notArrayOfFoo, 'Success'); // Uncaught TypeError: Argument 2 passed to Bar::{closure}() must be an instance of Foo, instance of NotFoo given...

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos Foo[] <- An array of type Foo */

Вот пример OO:

class Foo{}

class NotFoo{}

class Bar{
    /**
     * @param 

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos Foo[] */ public function doFoo(array

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

можно также использовать комментарии документа для представления подсказки типа.

[112]

Вот пример OO:

[113]

Примечание: Это также работает с нетипами объектов (интервал, строка, и т.д.)

foos,

Я даю универсальный ответ о выводе подсказок типа массивов в целом.

я сделал изменение выбранного ответа. Основное различие - то, что параметр является массивом вместо многих экземпляров проверенного класса.

[110]

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

[111]

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

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

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

4
ответ дан 1 November 2019 в 12:17

Другие вопросы по тегам:

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