이 포스트에서는 PHP에서 객체를 만드는 방법을 설명합니다.
객체를 만드는 방법은 클래스에서 객체를 만듭니다. 클래스가 필요없는 간단한 객체의 경우는 그냥 배열을 객체로 변환하는 방법을 쓸 수도 있지만, 대개는 클래스를 정의해서 만듭니다. 빵을 일정한 모양으로 빚어내기 위해서는 빵틀이 필요한 것처럼, 일정한 구조의 객체를 만들기 위해 클래스를 정의합니다.
일단, 아래의 코드를 봅시다.
<?php header("Content-Type: text/plain"); class GirlGroup { public $name, $members, $albums; } $LE_SSERAFIM = new GirlGroup(); $LE_SSERAFIM->name = 'LE SSERAFIM'; $LE_SSERAFIM->members = array('사쿠라','김채원','허윤진','카즈하','홍은채',); $LE_SSERAFIM->albums = array('FEARLESS','ANTIFRAGILE','UNFORGIVEN','Perfect Night','EASY','CRAZY',); echo "걸그룹 [" . $LE_SSERAFIM->name . "]의 멤버들은 다음과 같습니다:\n "; echo implode(", ", $LE_SSERAFIM->members) . "\n"; echo "\n"; echo "걸그룹 [" . $LE_SSERAFIM->name . "]의 발매 앨범은 다음과 같습니다:\n"; foreach ($LE_SSERAFIM->albums as $val) { echo " * " . $val . "\n"; } ?>
GirlGroup이라는 이름의 객체 구조를 정의합니다. 여기서는 그룹의 이름($name), 멤버의 이름($members), 앨범의 제목($albums)이 객체 내부의 변수로 정의됩니다.
이제 $LE_SSERAFIM이라는 이름의 변수를 정의합니다. 이 변수는 클래스 GirlGroup의 구조를 따르는 객체 변수로 정의됩니다.
그룹의 이름($name), 멤버의 이름($members), 앨범의 제목($albums)을 외부 접근으로 대입하였습니다. 이게 가능한 것은 5번 줄에서 해당 프로퍼티(객체 내 변수)를 외부 접근이 가능하도록 설정하고 있기 때문입니다. 5번 줄에서 public을 private로 바꾸면 이 코드처럼 외부 접근으로 대입하는 것이 불가능하고 내부적으로만 변수 제어를 할 수 있습니다.
이 코드의 실행 결과는 다음과 같습니다.
걸그룹 [LE SSERAFIM]의 멤버들은 다음과 같습니다: 사쿠라, 김채원, 허윤진, 카즈하, 홍은채 걸그룹 [LE SSERAFIM]의 발매 앨범은 다음과 같습니다: * FEARLESS * ANTIFRAGILE * UNFORGIVEN * Perfect Night * EASY * CRAZY
이번에는, 다른 코드를 보겠습니다.
<?php header("Content-Type: text/plain"); class GirlGroup { private $name, $members, $albums; public function __construct($name, $members, $albums) { $this->name = $name; $this->members = $members; $this->albums = $albums; } public function PrintMembers() { echo "걸그룹 [" . $this->name . "]의 멤버들은 다음과 같습니다: \n "; echo implode(", ", $this->members) . "\n"; } public function PrintAlbums() { echo "걸그룹 [" . $this->name . "]의 발매 앨범은 다음과 같습니다:\n"; foreach ($this->albums as $val) { echo " * " . $val . "\n"; } } } $LE_SSERAFIM = new GirlGroup( 'LE SSERAFIM', array( '사쿠라','김채원','허윤진','카즈하','홍은채', ), array( 'FEARLESS','ANTIFRAGILE','UNFORGIVEN','Perfect Night','EASY','CRAZY', ) ); $LE_SSERAFIM->PrintMembers(); echo "\n"; $LE_SSERAFIM->PrintAlbums(); ?>
5번 줄에서 프로퍼티 변수가 public이 아닌 private로 되어 있습니다. 이 때는 앞의 코드처럼 외부에서 직접 접근하면 오류가 발생합니다. 그 대신 생성자 함수(__construct)가 정의되어 객체 생성시 미리 프로퍼티 값을 받을 수 있도록 되어 있습니다. 그리고, 메서드(객체 내 함수)를 정의하여 내부의 프로퍼티를 처리할 수 있도록 되어 있습니다. 이 경우도 마찬가지로 public으로 정의해야 외부 호출이 가능하고, private로 정의하면 내부 호출만 가능합니다.
이 코드도 앞의 코드와 동일한 결과물이 나옵니다.