PHP7의 개체 배열을 암시하는 함수 반환 형식
저는 PHP 7의 새로운 기능에 매우 만족합니다만, PHP 7의 객체 배열을 어떻게 반환해야 할지 혼란스럽습니다.
예를 들어, 우리는 수업이 있다.Item
함수에서 이 클래스의 오브젝트 배열을 반환하고 싶습니다.
function getItems() : Item[] {
}
하지만 이런 식으로 돌아가지 않는다.
docblocks를 사용하여 힌트를 입력할 수 있습니다.
PhpStorm과 같은 PHP 에디터(IDE)는 이를 매우 잘 지원하며 이러한 어레이를 통해 반복할 때 클래스를 적절하게 해결합니다.
/**
* @return YourClass[]
*/
public function getObjects(): array
PHPStorm은 네스트된 어레이도 지원합니다.
/**
* @return YourClass[][]
*/
public function getObjects(): array
새로운 버전의 PHPStorm은 phpstan/psalm 형식을 지원합니다.
/**
* @return array<int, YourObject>
*/
public function getObjects(): array
사실 무슨 말인지 이해는 가지만, 유감스럽게도 당신은 그렇게 할 수 없습니다.PHP7에는 이러한 표현성이 없기 때문에 함수를 선언하여 "array"(일반 어레이)를 반환하거나 Item 배열인 새로운 클래스 ItemArray를 생성해야 합니다(단, 사용자가 직접 코드를 작성해야 합니다).
현재 "I want a array of Item" 인스턴스를 표현할 방법이 없습니다.
편집: 추가 참고 자료로 필요한 RFC의 '어레이 오브'는 여러 가지 이유로 거부되었습니다.
현재 버전의 PHP는 "개체 배열"과 같은 데이터 유형이 없기 때문에 개체 배열을 암시하는 기본 제공 유형을 지원하지 않습니다.클래스명은 특정 컨텍스트의 유형으로 해석할 수 있으며array
, 그러나 동시에 둘 다 아니다.
실제로 인터페이스를 기반으로 클래스를 작성함으로써 다음과 같은 엄격한 유형의 힌트를 구현할 수 있습니다.
class Item
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
}
class ItemsArray implements ArrayAccess
{
private $container = [];
public function offsetSet($offset, $value)
{
if (!$value instanceof Item) {
throw new Exception('value must be an instance of Item');
}
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->container[$offset]);
}
public function offsetUnset($offset)
{
unset($this->container[$offset]);
}
public function offsetGet($offset)
{
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
function getItems() : ItemsArray
{
$items = new ItemsArray();
$items[0] = new Item(0);
$items[1] = new Item(2);
return $items;
}
var_dump((array)getItems());
산출량
array(2) {
["ItemsArrayitems"]=>
array(0) {
}
["container"]=>
array(2) {
[0]=>
object(Item)#2 (1) {
["value":protected]=>
int(0)
}
[1]=>
object(Item)#3 (1) {
["value":protected]=>
int(2)
}
}
}
지금은 불가능합니다.단, 커스텀 어레이 클래스로 원하는 동작을 실현할 수 있습니다.
function getItems() : ItemArray {
$items = new ItemArray();
$items[] = new Item();
return $items;
}
class ItemArray extends \ArrayObject {
public function offsetSet($key, $val) {
if ($val instanceof Item) {
return parent::offsetSet($key, $val);
}
throw new \InvalidArgumentException('Value must be an Item');
}
}
비숍의 대답 덕분에
언급URL : https://stackoverflow.com/questions/40693469/function-return-type-hinting-for-an-array-of-objects-in-php7
'source' 카테고리의 다른 글
numpy 배열의 일부 치수만 평탄하게 만드는 방법 (0) | 2022.09.13 |
---|---|
조인 없이 여러 테이블에서 선택하시겠습니까? (0) | 2022.09.13 |
Jsoup 소켓 타임아웃예외: 읽기 시간이 초과되었습니다. (0) | 2022.09.13 |
SQL varchar 열 길이에 대한 모범 사례 (0) | 2022.09.13 |
Mac OS X의 MySQL 설치 위치 알아보기 (0) | 2022.09.13 |