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

PHPz
풀어 주다: 2024-09-11 06:33:54
원래의
1018명이 탐색했습니다.

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

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

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

1. 공개 액세스 수정자

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

예:

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. 액세스 수정자 요약

수정자 내부 수업 파생 클래스 외부 수업
Modifier Inside Class Derived Class Outside Class
Public Yes Yes Yes
Protected Yes Yes No
Private Yes No No
공개 예 예 예

보호됨

예 예 아니요 비공개 예 아니요 아니요
  • 5. 모범 사례
  • 필요한 것만 노출하려면 public
  • 을 아껴서 사용하세요. 캡슐화를 선호하고 공개 방법을 통해 기능을 노출합니다.
  • protected
  • 를 사용하면 하위 클래스가 필요한 속성이나 메서드에 액세스하는 동시에 외부 코드에서는 숨길 수 있습니다.

클래스 내부를 완전히 캡슐화하고 외부 또는 파생 클래스의 액세스를 방지하려면 private을 사용하세요.

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

위 내용은 PHP OOP의 액세스 수정자 이해: 공개, 보호 및 비공개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿