저는 워드 프레스에서 많은 작업을하는데 배열보다 객체를 반환하는 함수가 훨씬 더 많다는 것을 알게되었습니다. 특별히 배열을 요청하지 않는 한 데이터베이스 결과는 객체로 반환됩니다. 오류는 객체로 반환됩니다. WordPress 외부에서 대부분의 API는 배열 대신 객체를 제공합니다.
내 질문은 왜 배열 대신 객체를 사용합니까? 대부분의 경우 그다지 중요하지 않지만 어떤 경우에는 처리하는 것뿐만 아니라 머리를 감싸는 것이 더 어려운 물체를 찾습니다. 객체를 사용하는 성능상의 이유가 있습니까?
저는 독학으로 PHP 프로그래머입니다. 저는 인문학 학위를 받았습니다. 컴퓨터 과학의 근본적인 측면을 놓치고 있다면 저를 용서하십시오. 😉
답변
내가 일반적으로 객체를 선호하는 이유는 다음과 같습니다.
- 객체는 데이터뿐만 아니라 기능도 포함합니다.
- 객체에는 (대부분의 경우) 미리 정의 된 구조가 있습니다. 이것은 API 설계에 매우 유용합니다. 또한 속성을 public, protected 또는 private으로 설정할 수 있습니다.
- 객체는 객체 지향 개발에 더 적합합니다.
- 대부분의 IDE에서 자동 완성은 개체에 대해서만 작동합니다.
읽어야 할 것이 있습니다.
답변
이것은 아마도 몇 년 동안 대규모 소프트웨어 프로젝트에서 작업하기 전까지는 깊이 이해하지 못할 것입니다. 많은 새로운 컴퓨터 과학 전공자들이 모든 올바른 단어 (캡슐화, 데이터 기능 및 유지 관리 용이성)로 답을 제공하지만 그 모든 것이 왜 좋은지 이해하는 사람은 거의 없습니다.
몇 가지 예를 살펴 보겠습니다.
- 배열이 반환 된 경우 모든 값을 미리 계산하거나 더 복잡한 값을 작성할 수있는 많은 작은 값을 반환해야합니다.
WordPress 게시물 목록을 반환하는 API 메서드를 생각해보십시오. 이 게시물에는 모두 저자가 있고, 저자는 이름, 이메일 주소, 심지어 약력이있는 프로필도 있습니다.
배열의 모든 게시물을 반환하는 경우 게시물 ID의 배열을 반환하도록 제한해야합니다.
[233, 41, 204, 111]
또는 다음과 같은 대규모 배열을 반환합니다.
[ title: 'somePost', body: 'blah blah', 'author': ['name': 'billy', 'email': 'bill@bill.com', 'profile': ['interests': ['interest1', 'interest2', ...], 'bio': 'info...']] ]
[id: '2', .....]]
ID 목록을 반환하는 첫 번째 경우는 해당 게시물에 대한 정보를 얻기 위해 각 ID에 대해 API 호출을해야하기 때문에별로 도움이되지 않습니다.
두 번째 경우는 90 %의 시간이 필요한 것보다 더 많은 정보를 가져오고 더 많은 작업을 수행합니다 (특히 이러한 필드 중 하나라도 구축하기가 매우 복잡한 경우).
반면에 객체는 필요한 모든 정보에 대한 액세스를 제공 할 수 있지만 실제로 해당 정보를 아직 가져 오지 않았습니다. 객체를 사용할 때 필드의 값을 결정하는 것은 느리게 (즉, 값이 필요하고 사전에 필요하지 않은 경우) 수행 될 수 있습니다.
- 어레이는 의도 한 것보다 더 많은 데이터와 기능을 노출합니다.
반환되는 대규모 배열의 예로 돌아갑니다. 이제 누군가는 포스트 배열 내의 각 값을 반복하고 인쇄하는 애플리케이션을 빌드 할 수 있습니다. 해당 포스트 배열에 하나의 추가 요소 만 추가하도록 API가 업데이트되면 응용 프로그램 코드가 중단 될 것입니다. 왜냐하면 아마 안될 새 필드를 인쇄하기 때문입니다. API가 반환 한 포스트 배열의 항목 순서가 변경되면 애플리케이션 코드도 손상됩니다. 따라서 배열을 반환하면 개체가 만들지 않을 모든 종류의 가능한 종속성이 생성됩니다.
- 기능성
객체는 유용한 기능을 제공 할 수 있도록 내부에 정보를 보유 할 수 있습니다. 예를 들어, post 객체는 이전 또는 다음 게시물을 반환 할만큼 똑똑 할 수 있습니다. 어레이는 당신을 위해 그렇게 할 수 없습니다.
- 적응성
위에서 언급 한 개체의 모든 이점은보다 유연한 시스템을 만드는 데 도움이됩니다.
답변
내 질문은 왜 배열 대신 객체를 사용합니까?
아마도 두 가지 이유가 있습니다.
- WordPress는 꽤 오래되었습니다.
- 대부분의 경우 어레이가 더 빠르고 메모리를 덜 사용합니다.
- 직렬화가 더 쉬움
객체를 사용하는 성능상의 이유가 있습니까?
아니요.하지만 다음과 같은 많은 다른 좋은 이유가 있습니다.
- 객체 (메서드, 클로저 등)에 로직을 저장할 수 있습니다.
- 인터페이스를 사용하여 객체 구조를 강제 할 수 있습니다.
- IDE에서 더 나은 자동 완성
- 정의되지 않은 배열 키에 대한 알림을받지 못합니다.
- 결국 모든 객체를 배열로 쉽게 변환 할 수 있습니다.
(예를 들어 Ruby에서는 모든 것이 객체입니다. PHP는 이전에 절차 / 스크립팅 언어였습니다.)
답변
WordPress (및 상당량의 다른 PHP 응용 프로그램)는 기술적 이유가 아니라 개념적 이유로 배열보다는 객체를 사용합니다.
객체 (stdClass의 인스턴스 일지라도)는 하나의 표현입니다. WordPress에서 게시물, 댓글 또는 사용자 일 수 있습니다. 반면에 배열은 사물의 모음입니다. (예 : 게시물 목록)
역사적으로 PHP는 훌륭한 객체 지원이 없었기 때문에 배열은 초기에 상당히 강력 해졌습니다. (예를 들어, 제로 인덱스가 아닌 임의의 키를 가질 수있는 기능.) PHP 5에서 사용 가능한 객체 지원을 통해 개발자는 이제 배열 또는 객체를 키-값 저장소로 사용할 수 있습니다. 개인적으로 저는 객체와 배열이 제공하는 ‘엔티티’와 ‘컬렉션’의 구문 차이를 좋아하기 때문에 WordPress 접근 방식을 선호합니다.
답변
내 질문은 왜 (WordPress) 배열 대신 객체를 사용합니까?
정말 좋은 질문이고 대답하기 쉽지 않습니다. stdClass
기본적으로 레코드를 stdClass
개체 로 반환하는 데이터베이스 클래스를 사용하기 때문에 WordPress에서 개체 를 사용하는 것이 일반적이라고 가정 할 수 있습니다 . 그들은 그것에 익숙해졌고 (8 년 이상) 그게 다입니다. 나는 단순한 사실 뒤에 더 많은 생각이 있다고 생각하지 않습니다.
연관 배열을위한 문법 설탕
– 지브 수라 스키 표준 개체에 대한 PHP 이후 3
stdClass
객체는 배열보다 낫지 않습니다. 그들은 거의 동일합니다. 그것은 언어의 역사적 이유와stdClass
객체가 실제로 제한되어 있으며 실제로는 매우 기본적인 의미에서 일종의 가치 객체 일뿐 입니다.stdClass
객체는 항목 당 배열이 수행하는 것처럼 구성원의 값을 저장합니다. 그리고 그게 다야.- 오직 PHP 광들만
stdClass
이 개인 멤버로 객체 를 생성 할 수 있습니다 . 그렇게하면 많은 이점이 없습니다. stdClass
객체에는 메소드 / 함수가 없습니다. 따라서 WordPress에서는 사용하지 않습니다.- 와 비교할 때
array
목록 또는 반 구조화 된 데이터를 처리하는 데 훨씬 덜 유용한 기능이 있습니다.
그러나 배열에 익숙하다면 다음을 캐스팅하십시오.
$array = (array) $object;
그리고 이전에 객체였던 데이터에 배열로 액세스 할 수 있습니다. 또는 다른 방식으로 좋아합니다.
$object = (object) $array;
숫자와 같은 유효하지 않은 멤버 이름 만 삭제됩니다. 그러니 조심하세요. 그러나 나는 당신이 큰 그림을 얻는다고 생각합니다 stdClass
. 배열과 객체에 관한 한 큰 차이는 없습니다 .
관련 :
답변
- 그런 식으로 코드가 더 멋지게 보입니다.
- 참조로 전달되는 객체
- 객체는 배열보다 더 강력한 유형이므로 오류가 발생하기 쉽습니다 (또는 존재하지 않는 구성원을 사용하려고 할 때 의미있는 오류 메시지를 표시 함).
- 오늘날의 모든 IDE에는 자동 완성 기능이 있으므로 정의 된 개체로 작업 할 때 IDE가 많은 작업을 수행하고 작업 속도를 높입니다.
- 논리 와 데이터를 동일한 상자에 쉽게 캡슐화합니다 . 여기서 배열을 사용하면 데이터를 배열에 저장 한 다음 다른 함수를 사용하여 처리합니다.
- 상속, 기능이 거의 비슷하지 않은 유사한 배열이있는 경우 개체를 사용하려면 더 많은 코드를 복제해야합니다.
아마도 내가 생각했던 이유가 더있을 것입니다.
답변
객체는 배열보다 훨씬 강력합니다. 클래스의 인스턴스 인 각 개체에는 함수가 연결될 수 있습니다. 처리가 필요한 데이터가있는 경우 처리를 수행하는 함수가 필요합니다. 배열을 사용하면 해당 배열에서 해당 함수를 호출해야하므로 논리를 데이터에 직접 연결해야합니다. 개체를 사용하면이 연결이 이미 완료되었으며 더 이상 신경을 쓸 필요가 없습니다.
또한 정보 은닉의 OO 원칙을 고려해야합니다. 데이터베이스에서 반환되거나 데이터베이스로 이동하는 모든 항목에 직접 액세스 할 수있는 것은 아닙니다.