PHP 객체 지향 프로그래밍(OOP) 개념과 예제
⚡ 스마트 요약
PHP에서의 객체 지향 프로그래밍(OOP)은 클래스와 객체를 사용하여 실제 세계의 객체를 중심으로 애플리케이션을 모델링합니다. 이 가이드에서는 캡슐화, 상속, 다형성과 같은 OOP 원칙과 PHP에서 이러한 원칙들을 지원하는 방법, 그리고 클래스, 상속, 인터페이스 예제를 단계별로 설명합니다.

OOP란 무엇입니까?
객체 지향 프로그래밍은 직원, 자동차, 은행 계좌와 같은 현실 세계의 객체를 모델로 삼아 애플리케이션을 개발하는 소프트웨어 개발 접근 방식입니다. 클래스는 현실 세계 객체의 속성과 메서드를 정의합니다. 객체는 클래스의 인스턴스입니다.
객체 지향의 세 가지 기본 구성 요소는 다음과 같습니다.
- 객체 지향 분석 - 시스템 기능
- 객체 지향 설계 - 시스템 아키텍처
- 객체 지향 프로그래밍 – 애플리케이션 구현
객체지향 프로그래밍 원리
객체지향 프로그래밍의 세 가지 주요 원칙은 다음과 같습니다.
- 캡슐화 이는 구현 세부 사항을 숨기고 메서드만 노출하는 것과 관련이 있습니다. 캡슐화의 주요 목적은 다음과 같습니다.
- 소프트웨어 개발의 복잡성을 줄이세요. 구현 세부 사항을 숨기고 작업만 노출하면 클래스를 사용하기 쉬워집니다.
- 객체의 내부 상태를 보호합니다. 클래스 변수에 대한 접근은 get 및 set과 같은 메서드를 통해 이루어집니다. 이는 클래스를 유연하고 유지 관리하기 쉽게 만듭니다.
- 클래스의 내부 구현을 변경하더라도 해당 클래스를 사용하는 코드가 손상될 염려 없이 작업할 수 있습니다.
- 계승 상속은 클래스 간의 관계를 다룹니다. 부모와 자식 관계의 형태를 띠며, 자식 클래스는 부모 클래스에 정의된 메서드를 사용합니다. 상속의 주된 목적은 다음과 같습니다.
- 재사용성 – 여러 자식 클래스가 동일한 부모 클래스를 상속받을 수 있습니다. 이는 데이터베이스에서 데이터를 추가, 업데이트 및 삭제하는 것과 같은 공통 기능을 제공해야 할 때 매우 유용합니다.
- 다형성 이는 다양한 구현체를 가진 단일 인터페이스를 갖는 것과 관련이 있습니다. 다형성의 주요 목적은 다음과 같습니다.
- 애플리케이션 유지 관리를 간소화하고 확장성을 높이기 위해서입니다.
OOP Concepts PHP에서
PHP는 객체 지향 스크립트 언어이며, 위에 언급된 모든 원칙을 지원합니다. 이러한 원칙들은 다음을 통해 구현됩니다.
- 캡슐화 – "get" 및 "set" 메서드와 접근 제한자를 사용하여 접근할 수 있습니다.
- 계승 - extends 키워드를 사용하여
- 다형성 - implements 키워드를 사용하여
이제 우리는 OOP에 대한 기본 지식과 OOP가 어떻게 지원되는지 알게 되었습니다. PHP이제 위에서 제시한 원칙들을 적용한 사례들을 살펴보겠습니다.
UML이란 무엇입니까?
UML(통합 모델링 언어)은 객체 지향 시스템을 설계하고 문서화하는 데 사용되는 기술입니다.
UML은 여러 문서를 생성하지만, 객체 지향 PHP 프로그래밍에 매우 중요한 클래스 다이어그램을 살펴보겠습니다.
클래스 다이어그램 예
클래스 다이어그램 키
- The 상단 상자 클래스 이름이 포함되어 있습니다.
- The 중간 상자 클래스 변수를 포함합니다
- The 아래 상자 클래스 메소드를 포함합니다
- The 빼기(-) 표시는 개인 범위를 의미합니다.
- The 더하기 (+) 기호는 공개 범위를 의미합니다.
- The 해시(#) 기호는 보호된 범위를 의미합니다.
PHP에서 클래스를 만드는 방법
class 키워드는 PHP에서 클래스를 정의하는 데 사용됩니다. 다음은 PHP에서 클래스를 생성하는 규칙입니다.
- 클래스 이름은 문자로 시작해야 합니다.
- 클래스 이름은 PHP 예약어일 수 없습니다.
- 클래스 이름에는 공백이 포함될 수 없습니다.
동물을 나타내는 클래스를 만들고 싶다고 가정해 봅시다. 먼저 모든 동물에 공통적인 특징을 파악하는 것부터 시작하겠습니다.
- 모든 동물은 초식동물, 육식동물 등과 같은 과에 속합니다.
- 모든 동물은 음식을 먹는다
아래 그림은 동물에 대한 클래스 다이어그램을 보여줍니다.
이제 Animal 클래스를 코딩해 보겠습니다.
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
이리,
- “private $family, $food”는 클래스 외부에서 해당 변수에 직접 접근할 수 없다는 것을 의미합니다(캡슐화).
- `public function __construct($family…)`는 PHP 생성자 메서드입니다. 이 함수는 클래스의 인스턴스가 생성될 때마다 호출됩니다. 이 예에서는 `family`와 `food`를 설정하고 있습니다.
- “공개 함수 get…()”은 가족 또는 음식 값에 접근하는 데 사용되는 메서드입니다(캡슐화).
- “공개 함수 set…()”은 가족 또는 음식 값을 설정하는 데 사용되는 메서드입니다(캡슐화).
PHP에서 상속을 구현하는 방법
우리는 소와 사자와 함께 일할 것입니다. 소와 사자 모두 Animal 클래스를 상속받습니다.
아래 클래스 다이어그램은 관계를 보여줍니다.
소는 Animal 클래스를 상속받고 자체 변수와 메서드를 정의한다는 점에 유의하세요.
이제 Cow 클래스를 코딩해 보겠습니다.
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
이제 Lion 클래스를 코딩해 보겠습니다.
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
이리,
- “class … extends Animal” 구문은 Cow 및 Lion 클래스가 Animal 클래스의 메서드를 사용하도록 합니다(상속).
클래스의 객체를 생성하는 방법
단순화를 위해 Animal, Cow 및 Lion 클래스는 모두 동일한 디렉토리에 있어야 합니다.
이제 우리가 만든 클래스를 사용하는 애플리케이션을 만들어 보겠습니다.
PHP 클래스 예
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Carnivore', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
응용 프로그램 테스트
이제 웹 브라우저에서 애플리케이션을 살펴보겠습니다.
두 객체 모두 Animal 클래스에서 상속받은 get_family 및 get_food 메서드를 재사용하는데, 이는 상속이 실제로 어떻게 작동하는지 보여줍니다.
PHP에서 다형성을 구현하는 방법
예를 들어, 우리는 다양한 데이터베이스 엔진에 연결되는 애플리케이션을 개발하고 싶다고 가정해 봅시다. MySQL SQL 서버이지만 동일한 균일한 인터페이스를 사용합니다. 표준 메서드와 절대적인 값을 정의하는 인터페이스를 만들 수 있습니다.trac공통 메서드를 구현하는 클래스입니다.
- 인터페이스 – 수업과 비슷해요. 메소드와 매개변수만 정의합니다.
- ABStract 클래스 – 객체를 직접 생성하는데 사용할 수 없는 클래스입니다. 그 목적은 일반적인 메서드의 부분 또는 전체 구현을 제공하는 것입니다.
아래 클래스 다이어그램은 abs 간의 관계를 보여줍니다.tract 클래스, 인터페이스 및 구현 클래스.
이제 복근을 만들어 봅시다tract 클래스.
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
이리,
- 복근trac"t 클래스"는 해당 클래스를 사용하여 객체를 직접 생성할 수 없음을 의미합니다.
- "$host, $db…"는 모든 구현에서 공통으로 사용되는 클래스 변수입니다.
- “__construct(…)” 함수는 클래스 생성자 메서드로, 초기화 시 공통 변수 값을 설정합니다.
이제 데이터베이스 엔진에 따라 다르게 구현될 표준 메서드를 포함하는 인터페이스를 만들어 보겠습니다.
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
이리,
- "인터페이스"는 인터페이스를 만드는 키워드입니다.
- "공용 함수...(...)"는 구현되어야 하는 표준 메서드입니다.
이제 DBCommonMethods 클래스를 확장하고 DBInterface 인터페이스를 구현할 구체적인 클래스를 만들어 보겠습니다. 먼저, MySQLDriver.php:
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
다음으로 MSSQLServerDriver.php를 살펴보겠습니다.
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
이리,
- “클래스 …는 DBCommonMethods를 상속합니다”는 DBCommonMethods의 메서드를 사용합니다.
- “…DBInterface를 구현합니다”라는 문구는 사용되는 데이터베이스 드라이버와 관계없이 해당 클래스가 표준 메서드를 제공하도록 보장합니다.
위 클래스를 사용하는 코드는 다음과 같습니다.
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
또는 :
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
나머지 코드는 두 드라이버 모두 동일합니다. 예를 들면 다음과 같습니다.
<?php $db->db_connect(); $db->insert($data); ?>
이것이 바로 다형성의 실제 적용 사례입니다. 동일한 메서드 호출은 인터페이스를 구현하는 모든 드라이버에서 작동하므로 데이터베이스 엔진을 변경하더라도 주변 코드는 전혀 변경되지 않습니다.





