"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > PHP OOP의 액세스 수정자 이해: 공개, 보호 및 비공개

PHP OOP의 액세스 수정자 이해: 공개, 보호 및 비공개

2024-11-08에 게시됨
검색:424

Understanding Access Modifiers in PHP OOP: Public, Protected, and Private

PHP 객체 지향 프로그래밍(OOP)에서 액세스 한정자는 클래스 속성과 메서드의 가시성을 제어합니다. PHP의 기본 액세스 수정자는 공개, 보호 및 비공개입니다.

이 글에서는 이러한 액세스 한정자의 목적과 사용법을 안내하고 PHP OOP에서 이를 효과적으로 적용하는 방법을 설명합니다.

1. 공개 액세스 수정자

  • 키워드: 공개
  • 가시성: 클래스 내부, 클래스 외부, 파생 클래스 등 어디에서나 액세스할 수 있습니다.
  • 사용 사례: 모든 컨텍스트에서 액세스할 수 있어야 하는 속성이나 메서드에 공개를 사용합니다.

예:

class User {
    public $name = "John";

    public function greet() {
        return "Hello, " . $this->name;
    }
}

$user = new User();
echo $user->greet();  // Output: Hello, John

이 예에서는 $name 속성과 Greeting() 메서드가 모두 공개되어 클래스 외부에서 직접 액세스할 수 있습니다.

2. 보호된 액세스 수정자

  • 키워드: 보호됨
  • 가시성: 클래스 자체 내에서 및 하위 클래스(하위 클래스)에서 액세스할 수 있지만 클래스 외부에서는 액세스할 수 없습니다.
  • 사용 사례: 파생 클래스가 특정 속성이나 메서드에 액세스하는 동시에 외부 코드로부터 숨겨지도록 하려면 protected를 사용하세요.

올바른 액세스의 예:

class Person {
    protected $age = 30;

    protected function getAge() {
        return $this->age;
    }
}

class Employee extends Person {
    public function showAge() {
        return $this->getAge();  // Correct: Accesses protected method within a subclass
    }
}

$employee = new Employee();
echo $employee->showAge();  // Output: 30

이 예에서 getAge()는 Person의 하위 클래스인 Employee 클래스 내에서 액세스할 수 있는 보호된 메서드입니다.

오류가 있는 예:

class Person {
    protected $age = 30;

    protected function getAge() {
        return $this->age;
    }
}

$person = new Person();
echo $person->getAge();  // Error: Cannot access protected method Person::getAge()

오류 메시지: 치명적인 오류: 잡히지 않음 오류: 보호된 메서드에 액세스할 수 없음 Person::getAge()

이 경우 Person 인스턴스에서 보호된 메서드 getAge()에 직접 액세스하려고 하면 클래스 외부에서 보호된 메서드에 액세스할 수 없기 때문에 오류가 발생합니다.

3. 비공개 액세스 수정자

  • 키워드: 비공개
  • 가시성: 정의된 클래스 내에서만 액세스할 수 있습니다. 서브클래스나 외부 코드에서는 액세스할 수 없습니다.
  • 사용 사례: 파생 클래스를 포함하여 클래스 외부의 코드에서 속성이나 메서드를 숨기려면 private을 사용합니다.

올바른 액세스의 예:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }

    public function showBalance() {
        return $this->getBalance();  // Correct: Accesses private method within the same class
    }
}

$account = new BankAccount();
echo $account->showBalance();  // Output: 1000

이 예에서 getBalance() 메서드는 비공개이므로 BankAccount 클래스 내에서만 액세스할 수 있습니다. showBalance() 메서드는 공개 메서드이며 비공개 getBalance()에 간접적으로 액세스하는 데 사용할 수 있습니다.

오류가 있는 예:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
echo $account->getBalance();  // Error: Cannot access private method BankAccount::getBalance()

오류 메시지: 치명적인 오류: 잡히지 않음 오류: 비공개 메소드 BankAccount::getBalance()

에 액세스할 수 없습니다.

이 경우 BankAccount 인스턴스에서 직접 프라이빗 메서드 getBalance()에 액세스하려고 하면 클래스 외부에서 프라이빗 메서드에 액세스할 수 없기 때문에 오류가 발생합니다.

하위 클래스에 오류가 있는 예:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }
}

class SavingsAccount extends BankAccount {
    public function showBalance() {
        return $this->getBalance();  // Error: Cannot access private method BankAccount::getBalance()
    }
}

$savings = new SavingsAccount();
echo $savings->showBalance();

오류 메시지: 치명적인 오류: 잡히지 않음 오류: 비공개 메소드 BankAccount::getBalance()

에 액세스할 수 없습니다.

여기에서 개인 메소드 getBalance()는 SavingsAccount와 같은 하위 클래스에서도 액세스할 수 없습니다. 이는 정의 클래스 외부에서 개인 메소드에 액세스할 수 없음을 보여줍니다.

4. 접근 수정자 요약

수정자 클래스 내부 파생 클래스 외부수업
공공의
보호됨 아니요
사적인 아니요 아니요

5. 모범 사례

  • 공개를 아껴서 필요한 것만 노출하세요. 캡슐화를 선호하고 공개 방법을 통해 기능을 노출합니다.
  • 보호를 사용하면 하위 클래스가 필요한 속성이나 메서드에 액세스하는 동시에 외부 코드에서 숨길 수 있습니다.
  • 클래스 내부를 완전히 캡슐화하고 외부 또는 파생 클래스의 액세스를 방지하려면 private를 사용하세요.

결론

PHP의 액세스 수정자(공개, 보호, 비공개)는 OOP에서 가시성과 캡슐화를 관리하는 메커니즘을 제공합니다. 이러한 수정자를 올바르게 이해하고 적용하면 보다 안전하고 유지 관리가 쉬운 코드를 만들 수 있습니다.

릴리스 선언문 이 기사는 https://dev.to/ialaminpro/understanding-access-modifiers-in-php-oop-public-protected-and-private-5bah?1에서 복제됩니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3