PHP는 혼합 패러다임 언어이므로 배열과 같은 객체가 아닌 데이터 유형을 사용하고 반환 할 수 있습니다. 특정 상황에서 사용할 프로그래밍 구조를 결정할 때 배열 대 객체 선택에 대한 몇 가지 지침을 명확히하려고합니다.
이것은 실제로 PHP 언어 구조를 사용하여 데이터를 인코딩하는 방법과 데이터 전달 목적 (예 : 서비스 지향 아키텍처 또는 웹 서비스)을 위해 다른 방법을 선택하는 방법에 대한 질문입니다.
예
{cost, name, part_number, item_count}로 구성된 항목 유형이 있다고 가정하십시오. 프로그램은 배열 을 외부 컨테이너로 사용하여 각 항목 유형을 보유 하기로 결정한 여러 항목 유형의 표시를 요구합니다 . [당신은 또한 PHP이야 사용할 수 있습니다 ArrayObject
OO 패러다임에 대한,하지만 내 질문에 대해 아닙니다 그 (외부) 배열]. 내 질문은 항목 유형 데이터를 인코딩하는 방법과 사용할 패러다임에 관한 것입니다. PHP는 사용할 수 있습니다 PHP Native Arrays
또는 PHP Objects
.
다음과 같이 두 가지 방법으로 이러한 데이터를 인코딩 할 수 있습니다.
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
vs
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
내가 생각하는 것
배열 인코딩은 가볍고 JSON을 더 많이 사용할 수 있지만 엉망이되기 쉽습니다. 연관 배열 키 중 하나를 잘못 입력하면 잡기가 더 어려운 오류가있을 수 있습니다. 그러나 변덕스런 변화가 더 쉽습니다. item_count
더 이상 저장하고 싶지 않다면 텍스트 처리 소프트웨어를 사용 item_count
하여 배열의 모든 인스턴스 를 쉽게 제거한 다음 그에 따라 사용하는 다른 기능을 업데이트 할 수 있습니다. 더 지루한 과정 일 수 있지만 간단합니다.
객체 지향 인코딩은 IDE 및 PHP 언어 기능을 호출하며 미리 오류를 쉽게 잡을 수 있지만 처음에는 프로그래밍 및 코딩하기가 더 어렵습니다. 객체에 대해 조금 생각하고, 미리 생각해야하고, OO 코딩은 배열 구조를 입력하는 것보다 약간 높은 인지력을 필요로하기 때문에 더 열심히 말합니다. 즉, 일단 코드화되면 일부 변경은 구현하기가 더 쉬울 수 item_count
있는데, 예 를 들어을 제거 하면 더 적은 코드 행을 변경해야합니다. 그러나 높은 수준의 OO 기능이 관련되어 있으므로 변경 방법 자체는 어레이 방법에 비해 여전히 높은인지 부하를 요구할 수 있습니다.
질문
데이터에 대한 조작을 수행 해야하는 경우와 같이 어떤 경우에는 분명합니다. 그러나 몇 줄의 "항목 유형"데이터 만 저장해야하는 경우에는 배열 사용 여부 또는 객체 구성 여부를 결정할 때 고려해야 할 명확한 지침이나 고려 사항이 없습니다. 동전을 던져 버릴 수있을 것 같습니다. 이 경우입니까?
array
, 2 : User-defined Class
, 3 : stdClass
. 비교할 때 속도면에서 성능은 거의 동일 array
a와 User-defined class
(예로서 ItemType
)하지만, 정의 class
ES를 사용하는 것보다 적은 메모리를 사용하는 경향이 array
들. stdClass
반면에 세 가지 옵션 중 가장 느리고 메모리도 가장 많이 사용합니다.
(object)['foo'=>'bar']
. 결과 값은 classStdClass
이며 전체적으로 JSON으로 인코딩되며json_encode()
속성은 배열 인덱스처럼 쉽게 이름을 바꿀 수 있습니다 (변수를 통해 간접적으로 액세스 할 때 항상 쉽지는 않습니다). 그러나 이러한 값에는 다른 작업이 있습니다. 예를 들어, 배열 공용체가 있으므로 개체 공용체가 없으며array_*()
함수를 직접 사용할 수 없습니다 .