PHP 객체 지향 프로그래밍(OOP) 개념과 예제

⚡ 스마트 요약

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

  • 🧱 클래스와 객체: 클래스는 현실 세계 사물의 속성과 메서드를 정의하고, 객체는 해당 클래스의 단일 인스턴스입니다.
  • 🔒 캡슐화 : 공개된 get 및 set 메서드를 가진 private 변수는 내부적인 세부 정보를 숨기고 객체의 상태를 보호합니다.
  • 👪 계승: `extends` 키워드를 사용하면 자식 클래스가 부모 클래스의 메서드를 재사용할 수 있으므로 코드 중복을 줄일 수 있습니다.
  • 🔁 다형성 : 인터페이스는 여러 클래스가 서로 다르게 구현하는 표준 메서드를 하나의 통일된 개념으로 정의합니다.tract.
  • 📐 UML 클래스 다이어그램: 클래스 다이어그램은 클래스 이름, 변수 및 메서드를 보여주며, 플러스(+), 마이너스(-) 및 해시(#) 표시를 사용하여 공개, 비공개 및 보호 범위를 나타냅니다.
  • 🧩 인터페이스 및 앱tract: 복근trac클래스는 공통 코드를 공유하는 반면, 인터페이스는 각 드라이버 클래스가 동일한 메서드를 제공하도록 보장합니다.
  • 🤖 AI 지원: AI 도구는 설명으로부터 PHP 클래스를 생성하고 절차적 코드를 깔끔한 객체 지향 코드로 리팩토링할 수 있습니다.

PHP 객체 지향 프로그래밍

OOP란 무엇입니까?

객체 지향 프로그래밍은 직원, 자동차, 은행 계좌와 같은 현실 세계의 객체를 모델로 삼아 애플리케이션을 개발하는 소프트웨어 개발 접근 방식입니다. 클래스는 현실 세계 객체의 속성과 메서드를 정의합니다. 객체는 클래스의 인스턴스입니다.

객체 지향의 세 가지 기본 구성 요소는 다음과 같습니다.

  • 객체 지향 분석 - 시스템 기능
  • 객체 지향 설계 - 시스템 아키텍처
  • 객체 지향 프로그래밍 – 애플리케이션 구현

객체지향 프로그래밍 원리

객체지향 프로그래밍의 세 가지 주요 원칙은 다음과 같습니다.

  • 캡슐화 이는 구현 세부 사항을 숨기고 메서드만 노출하는 것과 관련이 있습니다. 캡슐화의 주요 목적은 다음과 같습니다.
    • 소프트웨어 개발의 복잡성을 줄이세요. 구현 세부 사항을 숨기고 작업만 노출하면 클래스를 사용하기 쉬워집니다.
    • 객체의 내부 상태를 보호합니다. 클래스 변수에 대한 접근은 get 및 set과 같은 메서드를 통해 이루어집니다. 이는 클래스를 유연하고 유지 관리하기 쉽게 만듭니다.
    • 클래스의 내부 구현을 변경하더라도 해당 클래스를 사용하는 코드가 손상될 염려 없이 작업할 수 있습니다.
  • 계승 상속은 클래스 간의 관계를 다룹니다. 부모와 자식 관계의 형태를 띠며, 자식 클래스는 부모 클래스에 정의된 메서드를 사용합니다. 상속의 주된 목적은 다음과 같습니다.
    • 재사용성 – 여러 자식 클래스가 동일한 부모 클래스를 상속받을 수 있습니다. 이는 데이터베이스에서 데이터를 추가, 업데이트 및 삭제하는 것과 같은 공통 기능을 제공해야 할 때 매우 유용합니다.
  • 다형성 이는 다양한 구현체를 가진 단일 인터페이스를 갖는 것과 관련이 있습니다. 다형성의 주요 목적은 다음과 같습니다.
    • 애플리케이션 유지 관리를 간소화하고 확장성을 높이기 위해서입니다.

OOP Concepts PHP에서

PHP는 객체 지향 스크립트 언어이며, 위에 언급된 모든 원칙을 지원합니다. 이러한 원칙들은 다음을 통해 구현됩니다.

  • 캡슐화 – "get" 및 "set" 메서드와 접근 제한자를 사용하여 접근할 수 있습니다.
  • 계승 - extends 키워드를 사용하여
  • 다형성 - implements 키워드를 사용하여

이제 우리는 OOP에 대한 기본 지식과 OOP가 어떻게 지원되는지 알게 되었습니다. PHP이제 위에서 제시한 원칙들을 적용한 사례들을 살펴보겠습니다.

UML이란 무엇입니까?

UML(통합 모델링 언어)은 객체 지향 시스템을 설계하고 문서화하는 데 사용되는 기술입니다.

UML은 여러 문서를 생성하지만, 객체 지향 PHP 프로그래밍에 매우 중요한 클래스 다이어그램을 살펴보겠습니다.

클래스 다이어그램 예

OOP Concepts PHP에서

클래스 다이어그램 키

  • The 상단 상자 클래스 이름이 포함되어 있습니다.
  • The 중간 상자 클래스 변수를 포함합니다
  • The 아래 상자 클래스 메소드를 포함합니다
  • The 빼기(-) 표시는 개인 범위를 의미합니다.
  • The 더하기 (+) 기호는 공개 범위를 의미합니다.
  • The 해시(#) 기호는 보호된 범위를 의미합니다.

PHP에서 클래스를 만드는 방법

class 키워드는 PHP에서 클래스를 정의하는 데 사용됩니다. 다음은 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 클래스를 상속받습니다.

아래 클래스 다이어그램은 관계를 보여줍니다.

PHP에서 상속 구현

소는 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();
?>

응용 프로그램 테스트

이제 웹 브라우저에서 애플리케이션을 살펴보겠습니다.

PHP의 상속

두 객체 모두 Animal 클래스에서 상속받은 get_family 및 get_food 메서드를 재사용하는데, 이는 상속이 실제로 어떻게 작동하는지 보여줍니다.

PHP에서 다형성을 구현하는 방법

예를 들어, 우리는 다양한 데이터베이스 엔진에 연결되는 애플리케이션을 개발하고 싶다고 가정해 봅시다. MySQL SQL 서버이지만 동일한 균일한 인터페이스를 사용합니다. 표준 메서드와 절대적인 값을 정의하는 인터페이스를 만들 수 있습니다.trac공통 메서드를 구현하는 클래스입니다.

  • 인터페이스 – 수업과 비슷해요. 메소드와 매개변수만 정의합니다.
  • ABStract 클래스 – 객체를 직접 생성하는데 사용할 수 없는 클래스입니다. 그 목적은 일반적인 메서드의 부분 또는 전체 구현을 제공하는 것입니다.

아래 클래스 다이어그램은 abs 간의 관계를 보여줍니다.tract 클래스, 인터페이스 및 구현 클래스.

PHP의 상속

이제 복근을 만들어 봅시다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);
?>

이것이 바로 다형성의 실제 적용 사례입니다. 동일한 메서드 호출은 인터페이스를 구현하는 모든 드라이버에서 작동하므로 데이터베이스 엔진을 변경하더라도 주변 코드는 전혀 변경되지 않습니다.

자주 묻는 질문

복근trac클래스는 구현된 메서드와 속성을 모두 가질 수 있으며, 클래스는 하나의 인터페이스만 상속할 수 있습니다. 인터페이스는 메서드 시그니처만 선언하며, 클래스는 여러 인터페이스를 구현할 수 있습니다. 절대적인 규칙을 사용하세요.trac코드 공유를 위한 클래스, 규칙을 강제하는 인터페이스tract.

네 가지 핵심 요소는 캡슐화, 상속, 다형성 및 abs입니다.trac이 튜토리얼은 처음 세 가지, 즉 복근에 초점을 맞춥니다.trac이 코드는 복잡한 세부 사항을 간단한 인터페이스 뒤에 숨기고 있으며, PHP는 이를 abs를 통해 지원합니다.tract 클래스와 인터페이스.

public 멤버는 어디에서든 접근 가능하고, private 멤버는 같은 클래스 내부에서만 접근 가능하며, protected 멤버는 해당 클래스와 하위 클래스 내에서만 접근 가능합니다. 이들은 각 속성이나 메서드를 읽거나 변경할 수 있는 사람을 제어함으로써 캡슐화를 강화합니다.

네. AI에 필드나 테이블 정의를 제공하면, AI는 타입이 지정된 속성, 생성자, 그리고 get 및 set 메서드를 가진 클래스를 생성할 수 있습니다. Rev클래스를 사용하기 전에 데이터 유형을 확인하고 유효성 검사를 추가하세요.

네. 절차적 스크립트를 붙여넣으면 AI가 관련 함수와 데이터를 클래스로 그룹화하고, 캡슐화를 적용하고, 상속이나 인터페이스를 제안할 수 있습니다. 동작은 동일하게 유지되므로 리팩토링된 코드를 테스트하세요.

이 게시물을 요약하면 다음과 같습니다.