PHPDoc type hinting for array of objects?
Use:
/* @var $objs Test[] */
foreach ($objs as $obj) {
// Typehinting will occur after typing $obj->
}
when typehinting inline variables, and
class A {
/** @var Test[] */
private $items;
}
for class properties.
Previous answer from '09 when PHPDoc (and IDEs like Zend Studio and Netbeans) didn't have that option:
The best you can do is say,
foreach ($Objs as $Obj)
{
/* @var $Obj Test */
// You should be able to get hinting after the preceding line if you type $Obj->
}
I do that a lot in Zend Studio. Don't know about other editors, but it ought to work.
Is there a type hint for an array of objects of a specific class in PHP 8.1?
The short answer is no.
My understanding is that enforcing such a thing has terrible performance problems. Some people want to go all the way and have full blown generics, others just want type-safe collections. Some people worry that implementing the latter first might hinder the development of the former. So we’re at a standstill.
There’s the occasional discussion in the community such as this: https://externals.io/message/108175
How can I specify array of objects in PhpDoc
phpdoc themselves describe the use of arrays here:
1.4.4. Arrays
- undefined:
@return array
- single type:
@return int[]
- multi type:
@return (int|string)[]
The same should apply to variable definitions:
/* @var Type[] $arr */
phpdoc variable of class ArrayObject
PSR-5: PHPDoc proposes a form of Generics-style notation.
Syntax
Type[]
Type<Type>
Type<Type[, Type]...>
Type<Type[|Type]...>
Values in a Collection MAY even be another array and even another Collection.
Type<Type<Type>>
Type<Type<Type[, Type]...>>
Type<Type<Type[|Type]...>>
Examples
<?php
$x = [new Name()];
/* @var $x Name[] */
$y = new Collection([new Name()]);
/* @var $y Collection<Name> */
$a = new Collection();
$a[] = new Model_User();
$a->resetChanges();
$a[0]->name = "George";
$a->echoChanges();
/* @var $a Collection<Model_User> */
Note: If you are expecting an IDE to do code assist then it's another question about if the IDE supports PHPDoc Generic-style collections notation.
Function return type hinting for an array of objects in PHP7
I actually understand what you mean, but the answer unfortunately is that you can't do that. PHP7 lacks that kind of expressivity, so you can either declare your function to return "array" (a generic array) or you have to create a new class ItemArray which is an array of Item (but that meaning you will have to code it yourself).
There is currently no way to express "I want an array of Item" instances.
EDIT: As an added reference, here the "array of" RFC of what you wanted to do, it has been declined due to various reasons.
Type hinting in PHP 7 - array of objects
It's not included.
If it's not included, do you have Any clue why it was not included when type hinting was added?
With the current array implementation, it would require checking all array elements at runtime, because the array itself contains no type information.
It has actually already been proposed for PHP 5.6 but rejected: RFC "arrayof" - interestingly not because of performance issues which turned out to be neglible, but because there was no agreement in how exactly it should be implemented. There was also the objection that it is incomplete without scalar type hints. If you are interested in the whole discussion, read it in the mailing list archive.
IMHO array type hints would provide most benefit together with typed arrays, and I'd love to see them implemented.
So maybe it's about time for a new RFC and to reopen this discussion.
Partial Workaround:
you can type hint variadic arguments and thus write the signature as
function findUserByAge(int $age, User ...$users) : array
Usage:
findUserByAge(15, ...$userInput);
In this call, the argument $userInput
will be "unpacked" into single variables, and in the method itself "packed" back into an array $users
. Each item is validated to be of type User
. $userInput
can also be an iterator, it will be converted to an array.
Unfortunately there is no similar workaround for return types, and you can only use it for the last argument.
PHPStorm + PHPdoc - can I type hint individual array element?
You can define the array keys in advance, then PHPStorm will suggest them (CTRL+space)
$my = array();
$my['qwe'] = '';
$my['asd'] = '';
$my['zxc'] = '';
$my['']// inside '' will be autosuggest
You can also use phpdoc (CTRL+Q):
/**
* keys:
* <pre>
* some_array (array)
* some_bool (boolean)
* some_double (double)
* some_nice_integer (integer)
* </pre>
* @return array
*/
public function toArray(){
// return some array
}
Related Topics
How to Set Order by Params Using Prepared Pdo Statement
How to Write a PHP Ternary Operator
Forcing a Simplexml Object to a String, Regardless of Context
How to Define a Class Property Value Dynamically in PHP
How to Loop Through Two Arrays At Once
How to Properly Url Encode a String in PHP
Laravel 5.5 Ajax Call 419 (Unknown Status)
Using Sessions & Session Variables in a PHP Login Script
What Are the Differences in Die() and Exit() in PHP
Get Url Query String Parameters
Max Size of Url Parameters in _Get
Force File Download With PHP Using Header()
Turning Multidimensional Array into One-Dimensional Array
PHP Associative Array Duplicate Keys
Sum Values of Multidimensional Array by Key Without Loop