PHP의 객체 (1/2) (클래스 정의, 객체 생성, 접근, 생성자, 소멸자)
PHP의 객체 (1/2) (클래스 정의, 객체 생성, 접근, 생성자, 소멸자)
객체지향 언어(OOP, object-oriented programming)이 발전하면서, 함수 이상으로 코드를 재사용할 수 있게 되었다. 객체를 통해서 데이터를 요청하고, 객체를 통해서 데이터를 받아온다. 각각의 객체는 각각의 역할에 따른 데이터를 가지고 기능을 수행한다. 객체를 통해 코드를 재사용하면서, 적은 코드로 효율적인 프로그래밍이 가능해졌다.
객체를 사용하는 프로그램을 만들 때는 데이터와 코드의 합성인 클래스를 디자인 해야 한다. 이 클래스에 기반한 새 객체를 클래스의 인스턴스(instance)나 어커런스(occurrence)라고 한다.
클래스 정의
객체는 class 키워드로 클래스를 정의한다. 클래스의 정의에는 클래스 이름(대소문자 구분)과 속성, 메소드가 포함된다.
클래스는 데이터를 저장하는 속성 값을 가지고 있으며, 데이터를 가공/처리 하기 위한 메소드를 포함한다.
<?php class User{ // User 클래스 선언 public $id, $email, $name, $birthday; //public으로 변수 선언 function printUser(){ // User 클래스에 printUser 메소드 선언 print_r($this); // User 클래스 Print } } ?> |
print_r 함수는 객체의 정보를 출력해준다. 변수에 대입된 값이 없을때 printUser() 함수를 실행하면
User Object([id] => [email] => [name] => [birthday] => ) 가 출력된다.
객체 생성
객체를 생성하려면 new 키워드를 사용한다.
<?php $object = new User; // new 키워드로 User 객체를 생성한다. class User{ // User 클래스 선언 public $id, $email, $name, $birthday; //public으로 변수 선언 function printUser(){ // User 클래스에 printUser 메소드 선언 print_r($this); // User 클래스 Print } } ?> |
객체 접근
객체의 속성에 접근하는 방법은 -> 를 사용하는 것이다.
new로 생성한 User 클래스를 대입한 $object의 name 속성에 접근하기 위해서는
$object->name
또는 객체의 메소드인 printUser()에 접근하기 위해서는
$object->printUser();
이다.
속성이나 메소드에 접근할때는 $ 표시를 붙이지 않도록 주의해라. $를 붙이면 해당 변수를 가르키기 때문에 의도하지 않은 접근이나 오류를 발생시킬 수 있다.
만약 $name에 "Hyun"이 대입되어 있을때, $object->$name 을 사용하면,
$name은 "Hyun" 이기 때문에 $object->Hyun 이 된다.
$object(User 클래스)의 속성에는 Hyun이 없기 때문에 에러가 발생한다.
<?php $object = new User; // new 키워드로 User 객체를 생성한다. $object->printUser(); // 비어있는 User 객체 출력 $object->id = "3"; // User 객체의 id 속성에 3 대입 $object->name = "Hyun"; // User 객체의 name 속성에 Hyun 대입 $object->printUser(); // User 객체 출력 User object( [id]=>3 [email]=> [name]=>hyun [birthday]=>) class User{ // User 클래스 선언 public $id, $email, $name, $birthday; //public으로 변수 선언 function printUser(){ // User 클래스에 printUser 메소드 선언 print_r($this); // User 클래스 Print } } ?> |
객체 복제
new로 객체를 생성하여 매개 변수로 넘길 때는 참조로 넘어간다. 따라서 새로운 메모리를 할당하는 것이아닌 객체의 주소값을 전달하는 것이다. 다시 말해서 객체를 대입하는 것은 전체를 복사하는 것이 아니다.
참조로 주소값을 전달하면, 같은 메모리의 인스턴스를 사용하기 때문에 한쪽에서 객체의 속성에 접근하여 값을 변경하면, 다른 변수에서 해당 속성에 접근해도 같이 변경되어 있다.
새로운 객체의 복제를 원한다면 clone 키워드를 사용하면 된다.
<?php $object1 = new User(); // User 객체 생성하여 object1 변수에 대입 $object1->name = "Hyun"; // object1 객체의 name 속성에 Hyun 대입 $object2 = $object1; // object1 객체의 참조값 object2에 대입 $object2->name = "Rang"; // object2 객체의 name 속성에 Rang 대입 echo "object1 name = " . $object1->name . "<br>"; // Rang 출력 echo "object2 name = " . $object2->name . "<br>"; // Rang 출력 $object3 = clone $object1; // object1 객체를 복제하여 object3에 대입 $object3->name = "Ten"; // object3 객체의 name 속성에 Ten 대입 echo "object1 name = " . $object1->name . "<br>"; // Rang 출력 echo "object3 name = " . $object3->name . "<br>"; // Ten 출력 class User{ // User 클래스 선언 public $id, $email, $name, $birthday; //public으로 변수 선언 function printUser(){ // User 클래스에 printUser 메소드 선언 print_r($this); // User 클래스 Print } } ?> |
생성자 __construct()
새로운 객체를 생성할 때 매개 변수의 리스트를 호출되는 클래스로 전달할 수 있다.
이것은 여러 가지 속성을 초기화하는 생성자(Constructor)라고 하는 클래스 내에 특별한 메소드로 전달된다.
생성자는 __construct() 를 메소드 이름으로 사용한다.
<?php $object = new User(); // User 객체 생성하면서 __construct() 함수 실행 echo $object->name; // Hyun 출력 class User{ // User 클래스 선언 public $id, $email, $name, $birthday; //public으로 변수 선언 function __construct(){ // 생성자 선언 $this->name = "Hyun"; // 객체가 생성되면서 name 속성에 Hyun 대입 } function printUser(){ // User 클래스에 printUser 메소드 선언 print_r($this); // User 클래스 Print } } ?> |
소멸자 __destruct()
PHP 코드가 마지막 참조를 하고 났을 때나 스크립트가 끝에 도달한 경우 소멸자를 실행하며, 객체를 해제한다.
소멸자 메소드는 __destruct() 로 명명한다.
<?php $object = new User(); // User 객체 생성 echo $object->name; // Hyun 출력 class User{ // User 클래스 선언 public $id, $email, $name, $birthday; //public으로 변수 선언 function __construct(){ // 생성자 선언 $this->name = "Hyun"; // 객체가 생성되면서 name 속성에 Hyun 대입 } function __destruct(){ echo "User 객체 소멸"; } function printUser(){ // User 클래스에 printUser 메소드 선언 print_r($this); // User 클래스 Print } } ?> |
출처: https://hyeonstorage.tistory.com/115?category=549768 [개발이 하고 싶어요]
'PHP > php' 카테고리의 다른 글
[PHP][TIP|Trouble Shooting]PHP 파일 업로드 에러 코드 7 UPLOAD_ERR_CANT_WRITE (0) | 2021.01.06 |
---|---|
[PHP][TIP] exec 혹은 shell_exec 비동기로 처리하기 (0) | 2021.01.06 |
[PHP][TIP] http 302 (redirect) 일 때 curl 사용하기 (0) | 2021.01.06 |
PHP의 객체 (2/2) (메소드, 속성, 상수, 메소드 범위, 상속) (0) | 2019.07.25 |
PHP의 함수 (정의, 반환, 참조, 포함과 요구) (0) | 2019.07.25 |
PHP의 반복문 (for, while, do while, break, continue) (0) | 2019.07.25 |
PHP의 조건문 (if, switch, ? 연산자) (0) | 2019.07.25 |
PHP 시작 (2/2) - 알아두면 좋은 몇가지 (0) | 2019.07.25 |