공공, 개인 및 보호의 차이점은 무엇입니까?


988

언제, 왜 클래스 내 public에서 private, 및 protected함수와 변수를 사용해야 합니까? 그들 사이의 차이점은 무엇입니까?

예 :

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

59
이 질문은 각 키워드의 기능에 대한 문자 적 ​​정의를 제공하는 대신 실제 사용에 대한 실제적인 예를 통해 답변을 얻을 수 있다고 생각합니다.
Matthew

70
나는 정말로이 질문이 보호되지 않고 공개되어야한다고 생각한다.
dotancohen

답변:


1260

너는 사용한다:

  • public 해당 속성 / 방법을 개체의 다른 클래스 및 인스턴스에서 사용할 수 있도록합니다.

  • private 속성 / 방법이 자체 클래스에서만 표시되도록하려면 범위를 지정하십시오.

  • protected 부모 클래스를 포함하여 현재 클래스를 확장하는 모든 클래스에서 속성 / 방법을 표시하려는 경우 범위.

더 : (포괄적 인 정보를 위해)


79
protected현재 클래스와 부모 클래스 를 확장하는 모든 클래스에서 변수 / 함수를 표시하려는 경우 범위를 지정하십시오 .
Shahid

4
@Shahid-요점을 이해하지 못합니다. 클래스 A를 확장하는 클래스도 A의 부모 클래스를 확장합니다.
JDelage

4
@JDelage-링크를 참조하십시오http://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid

4
@Growler 왜 객체를 사용하는 것이 귀찮은가?
J.Steve

27
@Growler, 더 유용한 답변은 가능한 한 객체의 내부 작업을 최대한 숨기는 것이 좋습니다. 그렇게하면 깨질 가능성이 줄어 듭니다. 모든 것을 공개하면 다른 프로그래머가 객체의 내부 작업 이외의 다른 것에 의해 변경하고 싶지 않은 변수를 변경할 수 있습니다.
키프로스에서 휴식

1174

dd

공공의:

메소드 (함수) 또는 특성 (변수)을로 선언하면 다음 public과 같은 방법으로 해당 메소드 및 특성에 액세스 할 수 있습니다.

  • 그것을 선언 한 같은 클래스.
  • 위에서 선언 된 클래스를 상속하는 클래스
  • 이 클래스 외부의 모든 외부 요소도 해당 항목에 액세스 할 수 있습니다.

예:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

보호 :

메소드 (함수) 또는 특성 (변수)을로 선언하면 다음 protected과 같은 방법으로 해당 메소드 및 특성에 액세스 할 수 있습니다.

  • 그것을 선언 한 같은 클래스.
  • 위에서 선언 된 클래스를 상속하는 클래스

외부인 구성원은 해당 변수에 액세스 할 수 없습니다. 선언 된 클래스 자체의 객체 인스턴스 가 아니라는 의미에서 "외부인" .

예:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

정확한 오류는 다음과 같습니다.

PHP 치명적 오류 : 보호 된 속성 GrandPa :: $ name에 액세스 할 수 없습니다


은밀한:

메소드 (함수) 또는 특성 (변수)을로 선언하면 다음 private과 같은 방법으로 해당 메소드 및 특성에 액세스 할 수 있습니다.

  • 그것을 선언 한 같은 클래스.

외부인 구성원은 해당 변수에 액세스 할 수 없습니다. 외부인 은 선언 된 클래스 자체의 객체 인스턴스 가 아니며 선언 된 클래스를 상속받는 클래스조차도 아닙니다 .

예:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

정확한 오류 메시지는 다음과 같습니다.

알림 : 정의되지 않은 속성 : Daddy :: $ name
심각한 오류 : 개인 속성 GrandPa :: $ name에 액세스 할 수 없습니다


리플렉션을 사용하여 할아버지 클래스 해부

이 주제는 실제로 범위를 벗어난 것이 아니며 반사가 실제로 강력하다는 것을 증명하기 위해 여기에 추가하고 있습니다. 나는 세 가지 예 위의 언급했다로서, protected그리고 private멤버 (속성 및 메서드)는 클래스의 외부에서 액세스 할 수 없습니다.

그러나 반성을 통해 당신은 심지어 수업 외부의 회원들 과 액세스 하여 특별한 것을 할 수 있습니다 !protectedprivate

글쎄, 반사 란 무엇인가?

리플렉션은 클래스, 인터페이스, 함수, 메소드 및 확장을 리버스 엔지니어링하는 기능을 추가합니다. 또한 함수, 클래스 및 메소드에 대한 문서 주석을 검색하는 방법을 제공합니다.

전문

우리는 이름을 가진 클래스 Grandpas를 가지고 있으며 세 가지 속성이 있다고 말합니다. 이해하기 쉽도록 이름이있는 할아버지가 세 명 있다고 생각하십시오.

  • 마크 헨리
  • 존 클래쉬
  • 윌 존스

우리가 그들 (할당 수정)을 만들어 보자 public, protected그리고 private각각. 당신은 아주 잘 알고 protectedprivate회원은 클래스 외부에서 액세스 할 수 없습니다. 이제 리플렉션을 사용하여 진술과 모순합시다.

코드

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

산출:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

일반적인 오해 :

아래 예제와 혼동하지 마십시오. 여전히 볼 수 있듯이 반성을 사용하지 않으면 클래스 외부 에서 privateprotected멤버에 액세스 할 수 없습니다.

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

산출:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

디버깅 기능

print_r, var_export하고 var_dump있는 디버거 기능 . 변수는 사람이 읽을 수있는 형태로 정보를 제공합니다. 이 세 함수는 PHP 5에서 객체의 속성 protectedprivate속성을 나타냅니다 . 정적 클래스 멤버는 표시 되지 않습니다 .


추가 자료 :



이 콘보에 늦게 사과드립니다. 왜 누군가가 이것을 사용하는지 말해 줄 수 있습니까? 당신은 그들이 어떻게 작동하는지 완벽하게 설명했습니다. 나는 단지 이것들 각각에 대한 사용의 이점을 알고 싶습니다. 감사합니다
JamesG

@JamesG는 위의 다른 의견에서 조금 설명했습니다. stackoverflow.com/questions/4361553/…
cjmling

나는이 질문 중 조금 왜 어쩌면 모르지만 아무도 PHP에서 다른 두 개의 액세스 수정이 있다는 것을 언급되지 : 추상적이고 마지막이 키워드는 PHP 클래스에 사용할 수는 있지만, 여전히 액세스 수정
bxN5

1
Dhairya Lakhera가 제공하는 추상화에 대한 설명을 여기에서 읽으십시오 : stackoverflow.com/questions/2558559/… . Shankar Damodaran 설명에 완벽하게 추가되었습니다.
Julio Marchi

83

일반적으로 데이터 캡슐화 및 우수한 인터페이스 디자인을 촉진하므로 필요한 가시성을 최소화하는 것이 좋습니다. 멤버 변수 및 메소드 가시성을 고려할 때 다른 오브젝트와의 상호 작용에서 멤버가 수행하는 역할에 대해 생각하십시오.

"구현이 아닌 인터페이스로 코딩"하는 경우 가시성 결정을 내리는 것은 매우 간단합니다. 일반적으로 변수를 공개 할 적절한 이유가없는 한 변수는 개인용이거나 보호되어야합니다. 대신 클래스의 내부에 대한 액세스를 제한하고 규제하려면 공개 접근 자 (getter / setter)를 사용하십시오.

자동차를 비유로 사용하려면 속도, 기어 및 방향과 같은 것이 개인 인스턴스 변수입니다. 운전자가 공연비와 같은 것을 직접 조작하는 것을 원하지 않습니다. 대신 제한된 수의 작업을 공용 메서드로 노출합니다. 자동차에 대한 인터페이스는 방법 등이 포함될 수 있습니다 accelerate(), deccelerate()/ brake(), setGear(), turnLeft(), turnRight(), 등

운전자는 이러한 행동이 자동차 내부에서 어떻게 구현되는지를 알지 못하거나 신경 쓰지 않아야하며 기능이 노출되어 운전자와 도로의 다른 사람들에게 위험 할 수 있습니다. 따라서 공용 인터페이스를 디자인하고 해당 인터페이스 뒤에있는 데이터를 캡슐화하는 것이 좋습니다.

이 접근 방식을 사용하면 클라이언트 코드와의 인터페이스 계약을 위반하지 않고 클래스에서 공용 메소드의 구현을 변경하고 개선 할 수 있습니다. 예를 들어, accelerate()연료 효율을 높이기 위해 방법을 개선 할 수 있지만 해당 방법의 사용법은 동일하게 유지됩니다. 클라이언트 코드는 변경하지 않아도되지만 여전히 효율성 향상의 이점을 누릴 수 있습니다.

편집 : 당신이 (훨씬 더 어려운 언어의 문법에 비해 마스터에있는) 객체 지향 개념을 학습의 중간에 여전히 보이기 때문에, 나는 매우 의 사본을 데리러 추천 하고 연습 PHP 개체, 패턴 매트 Zandstra에 의해. 이 책은 저에게 구문을 가르치기보다는 OOP를 효과적으로 사용 하는 방법 을 먼저 가르쳐 준 책입니다 . 나는 몇 년 전에 구문을 배웠지 만, OOP의 "이유"를 이해하지 못하면 쓸모가 없었습니다.


3
이 게시물을 편집 할 때 권장되는 책은 정말 훌륭합니다. 지금까지의 덩어리는 꽤 깨달았습니다. 처음 몇 장은 수업 관련 질문에 대부분 답변했습니다.
Josiah

Smalltalk의 예와 같이 불필요한 세부 사항으로 생각을 혼동하지 않고 객체를 실제로 이해할 수있게 해주는 책은 David A Taylor ( 객체 지향 기술 : Object Teechnology 의 관리자 안내서비즈니스 엔지니어링)가 작성했습니다 . 두 페이지 모두 100 페이지에 불과하며 오후에는 읽을 수있을 정도로 쉽습니다. 물론 Gamma et al 's Design Patterns 이 있지만 기본 접근 방식은 간단히 '서브 클래스를 변경하려는 하위 클래스'로 설명 할 수 있습니다.
Patanjali

아주 좋은 비유입니다. 보호 대 개인을 위해 하나 있습니까?
Jānis Elmeris

79

private -클래스 내에서만 액세스 가능

protected -클래스 내 및 상속 클래스에서 액세스 가능

public -클래스 외부의 코드에서도 액세스 가능

이것은 변수뿐만 아니라 함수에도 적용됩니다.


여기에서 보호 된 정의가 올바른지 확실하지 않은 경우 실제로 선택된 답변에서 보호됨-상속 된 클래스에서만 액세스 할 수 있으며 원래 / 부모 클래스는 액세스 할 수 없습니다. "교실과 함께"라고 말하는 것은 약간 혼란 스러울 수 있습니다.
pal4life 2016 년

7
나는 그렇게 생각하지 않는다. 사실 선택된 답변이 여기에 혼란스러워 보인다. Shahids 의견을 참조하십시오. IMHO 보호 된 메소드는 원래 클래스 내에서 잘 액세스 할 수 있습니다.
Olaf

수업이 다른 수업의 대중에게 액세스 할 수 있습니까?
Serjas

1
@Serjas : 정적 메소드 / 필드가 아닌 한 다른 객체 만 아닙니다.
DanMan

이것이 모든 프로그래밍 언어에 적용되는지는 모르겠지만 PHP에서 "보호 된"속성 / 메소드는 선언 된 클래스 또는 속성 / 메소드를 정의하는 클래스에서 상속 된 클래스에서 액세스 할 수 있습니다.
John Slegers

25

차이점은 다음과 같습니다.

Public :: 클래스의 모든 사용자가 직접 공개 변수 또는 메소드에 액세스 할 수 있습니다.

Protected :: 클래스의 사용자는 보호 된 변수 또는 메소드에 액세스 할 수 없지만 클래스에서 상속 된 서브 클래스 내에서 액세스 할 수 있습니다.

Private :: 개인 변수 또는 메서드는 정의 된 클래스에서만 내부적으로 액세스 할 수 있습니다. 즉, 개인 변수 또는 메서드는 클래스를 확장하는 자식에서 호출 할 수 없습니다.


17

추상 예제를 통한 가시성 범위 :: 이해하기 쉽게

이러한 속성 또는 방법의 가시성은 세 가지 키워드 (공개, 보호 및 개인) 중 하나의 사전 선언 선언으로 정의됩니다.

Public : 속성 또는 메서드가 public으로 정의되면 객체를 참조 할 수있는 모든 것에 의해 액세스 및 조작 될 수 있음을 의미합니다.

  • 예를 들면 초록. 공개 가시성 범위 는 누구나 올 수있는 "공공 피크닉" 으로 생각하십시오 .

Protected : 속성 또는 메서드 가시성이 protected로 설정된 경우 클래스 자체 내에서 상속 된 상속 된 클래스를 통해서만 액세스 할 수 있습니다. (상속 :-클래스는 다른 클래스의 모든 속성과 메서드를 가질 수 있습니다).

  • 보호 된 가시성 범위를 회사와 가족이 공개적으로 허용되지 않는 "회사 소풍" 으로 생각하십시오 . 가장 일반적인 범위 제한입니다.

Private : 속성 또는 메서드 가시성을 private으로 설정하면 클래스 관계에 관계없이 프라이빗 멤버가있는 클래스 만 클래스 및 클래스 내에서 해당 메서드 및 속성에 액세스 할 수 있습니다.

  • 피크닉과 유사하게 피크닉에서 "회사 회원 만 허용되는 회사 피크닉"으로 생각 하십시오. 가족이 아닌 일반 대중도 허용되지 않습니다.

15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

에서 추출 :

http://php.net/manual/en/language.oop5.visibility.php


12

⚡️ 다음의 범위를 기억하는 쉬운 방법이다 public, protected하고 private.

PUBLIC:

  • public 범위 : 공용 변수 / 함수는 객체와 다른 클래스 모두에서 사용할 수 있습니다.

PROTECTED:

  • protected 범위 : 보호 된 변수 / 함수는 현재 클래스를 확장하는 모든 클래스에서 사용할 수 있습니다.
  • 아니! 개체가이 범위에 액세스 할 수 없습니다

PRIVATE:

  • private scope : 전용 변수 / 함수는 현재 정의 된 클래스에서만 볼 수 있습니다.
  • 아니! 현재 클래스를 확장하는 클래스는이 범위에 액세스 할 수 없습니다.
  • 아니! 개체가이 범위에 액세스 할 수 없습니다.

PHP Manual에서 메소드 또는 변수 의 가시성 을 읽으십시오 .


9

' when ' 고려 :
정확히 확실하지 않은 경우 처음에 모든 것을 비공개로 선언하는 경향이 있습니다. 그 이유는 일반적으로 다른 방법보다 개인 메소드를 공개하는 것이 훨씬 쉽다는 것입니다. 적어도 private 메소드가 클래스 자체가 아닌 다른 곳에서 사용되지 않았 음을 확신 할 수 있기 때문입니다. 공용 메소드는 이미 모든 곳에서 사용 중일 수 있으며 광범위한 재 작성이 필요할 수 있습니다.

업데이트 : protected캡슐화에 충분하고 클래스를 확장 할 때 방해가되지 않기 때문에 요즘 기본값 을 사용합니다 (어쨌든 피하려고합니다). 다른 두 가지를 사용해야 할 충분한 이유가있는 경우에만하겠습니다.

방법의 좋은 이유 private는 확장 클래스조차도 변경해서는 안되는 객체 고유의 것을 구현하는 것입니다 (실제 상태는 내부 상태 관리와 같은 캡슐화 외에도). 결국, protected방법이 일반적으로 사용되는 위치를 추적하는 것은 여전히 ​​쉽기 때문에 protected현재는 기본값 입니다. 어쩌면 "참호에서"100 % 객관적이지 않을 수도 있습니다.


3
업데이트를 통해 : "충분히 좋은"이유와 "좋은 이유"가 어떻게 여기에 더 잘 어울릴 수 있습니까? 예를 들어, 사용하는 private것이 여전히 "충분히 사용 하기" 는 쉽지만, 이전에 "좋은 이유"처럼 들리는 초기 이유 인 캡슐화는 더 이상 권장되지 않습니다.
hakre

@hakre : 캡슐화를 위해 노력해야하는 이유는 외부 범위로 누출되는 상태를 피하기 위해서입니다. protected이미하고 있지만 확장 / 상속을 위해 유연하게 유지하십시오. 다시 말해야 할 이유가없는 한 private.
DanMan

아마도 그것은 우리가 동의하지 않는 점일 것입니다. protected실제로는 외부 범위로 누출되며 구성을 선호하는 것이 낫지 만 상속을 암시 적으로 선호하는 것과 같은 나쁜 디자인 결정을 지원하기 때문에 종종 귀하의 방식입니다. 그렇기 때문에 실제 요구 사항이없는 경우 개인을 고수하는 것이 코드 작성을 시작하는 더 좋은 방법입니다. 또한 실제로 아직 결정하지 않은 상태에서 설계 결정을 너무 일찍 내릴 수는 없습니다.
hakre

나는 충분히 공평하기 때문에 전반적인 관점과 논쟁 protected하지는 않지만 외부 범위 (메소드 / 필드를 호출 / 액세스하는 코드) 로 누출되지 않지만 내부 범위 (확장 클래스) 로 누출되지 않습니다 . 사소한 차이가 있습니다. protected필드 사용보다 필드 사용을 추적하는 것이 훨씬 쉽습니다 public.
DanMan

6

PHP 매뉴얼은 여기 에 대한 질문을 잘 읽었습니다 .

선언에 public, protected 또는 private 키워드를 붙여서 속성 또는 메서드의 가시성을 정의 할 수 있습니다. public으로 선언 된 반원은 어디에서나 액세스 할 수 있습니다. protected로 선언 된 멤버는 클래스 자체 내에서 상속 된 부모 클래스를 통해서만 액세스 할 수 있습니다. private으로 선언 된 멤버는 멤버를 정의하는 클래스에서만 액세스 할 수 있습니다.


6

나에게 이것은 세 가지 속성 유형을 이해하는 가장 유용한 방법입니다.

공개 :이 변수를 코드의 어느 곳에서나 직접 액세스하고 변경할 수있을 때 사용하십시오.

수업 이외의 사용 예 :

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

Protected : 변수에 액세스하고 설정할 때 다른 프로그래머 (및 자신)가 클래스 외부에서 getter / setter를 사용하도록 강요하려는 경우 이것을 사용하십시오 (그러나 일관성 있고 클래스 내부의 getter 및 setter도 사용해야합니다). 이것은 private모든 클래스 속성을 설정해야하는 기본 방법입니다.

왜? 미래의 어느 시점 (아마도 5 분 정도)에 해당 속성에 대해 반환 된 값을 조작하거나 가져 오기 / 설정하기 전에 그 값으로 무언가를 수행하기로 결정한 경우 모든 위치에서 리팩토링하지 않고이를 수행 할 수 있습니다. 프로젝트에서 사용했습니다.

수업 이외의 사용 예 :

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

비공개 : private속성은 속성과 매우 유사 protected합니다. 그러나 두드러진 특징 / 차이점은 private부모 클래스의 getter 또는 setter를 사용하지 않고 자식 클래스에 액세스 할 수 없다는 것입니다.

따라서 기본적으로 속성에 getter 및 setter를 사용하는 경우 (또는 부모 클래스에서 내부적으로 만 사용하고 다른 곳에서 액세스 할 수없는 경우) 다른 private사람이 시도하지 못하게 할 수도 있습니다. 직접 사용하고 버그를 도입합니다 .

자식 클래스 내에서의 사용 예제 (MyObject를 확장) :

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();


4

PHP의 변수는 세 가지 유형으로 캐스트됩니다.

공개 :이 변수 유형의 값은 모든 범위에서 사용 가능하며 코드 실행시 호출됩니다. 다음과 같이 선언하십시오.public $examTimeTable;

개인 :이 유형의 변수 값은 속한 클래스에서만 사용할 수 있습니다. private $classRoomComputers;

보호 :이 클래스의 값은 상속 또는 하위 클래스의 형태로 액세스 권한이 부여 된 경우에만 사용 가능합니다. 일반적으로 ::부모 클래스에 의해 액세스 권한을 부여 하는 데 사용 됩니다

protected $familyWealth;


3

오래된 질문을 되풀이하지만 이것을 생각하는 가장 좋은 방법은 정의하고있는 API와 관련이 있다고 생각합니다.

  • public -공개로 표시된 모든 것은 클래스 / 인터페이스 / 다른 사용자가 사용하고 의존하는 API의 일부입니다.

  • protected-속지 마십시오. API의 일부이기도합니다! 사람들은 하위 클래스를 만들고 코드를 확장하며 보호 된 것으로 표시된 것을 사용할 수 있습니다.

  • private-개인 속성 및 방법은 원하는만큼 변경할 수 있습니다. 아무도 이것들을 사용할 수 없습니다. 이것들은 변경하지 않고 변경할 수있는 유일한 것입니다.

또는 Semver 용어로 :

  • 변경 사항 public또는 protected중대한 변경 사항으로 간주되어야합니다.

  • 새로운 것이 public거나 protected(최소한) 미성년자

  • privatePATCH는 새로운 것만 변경 가능

따라서 코드 유지 관리 측면에서 사용자가 만드는 것이 무엇인지 public또는 protected사용자에게 유망한 것이기 때문에 주의하는 것이 좋습니다 .


1

프로젝트에서 객체 지향 PHP를 따를 때, PHP에서 액세스 수정자를 사용하는 규칙을 따라야합니다. 오늘 우리는 access modifier가 무엇이고 어떻게 그것을 사용할 수 있는지 명확하게 배울 것입니다. PHP access modifiers는 PHP 클래스와 클래스 범위 내에서 정의 된 함수와 변수 인 멤버와의 액세스 권한을 설정하는 데 사용됩니다. PHP에는 클래스 멤버를위한 세 가지 범위가 있습니다.

  1. 공공의
  2. 은밀한
  3. 보호

이제 액세스 수정 자 액세스 수준을 이해하기 위해 다음 이미지를 살펴 보겠습니다. 여기에 이미지 설명을 입력하십시오

이제 액세스 수정 자로 사용되는 가능한 PHP 키워드에 대해 다음 목록을 살펴 보겠습니다.

public :-이 액세스 수정 자로 정의 된 클래스 또는 그 멤버는 클래스의 범위 밖에서도 어디서나 공개적으로 액세스 할 수 있습니다.

private :-이 키워드를 가진 클래스 멤버는 클래스 자체 내에서 액세스됩니다. 하위 클래스에서 개인 데이터에 액세스 할 수 없습니다. 클래스 외부 액세스로부터 멤버를 보호합니다.

protected :-서브 클래스가 보호 된 수퍼 클래스 멤버에 액세스 할 수 있다는 점을 제외하면 private과 동일합니다.

이제 액세스 수정자를 이해하려면 표를 참조하십시오. 전체 기사 읽기 PHP 액세스 modifire


1

Public:는 변수 또는 메소드를 선언 할 때 기본 상태이며, 객체에 직접 액세스 할 수 있습니다.

Protected: 객체와 서브 클래스 내에서만 액세스 할 수 있습니다.

Private: 서브 클래스가 아닌 객체 내에서만 참조 할 수 있습니다.


0

언급 된 키워드는 액세스 수정 자이며 캡슐화 (또는 정보 숨기기)를 구현하는 데 도움이됩니다. 컴파일러는 정의중인 필드 나 메소드에 액세스 할 수있는 다른 클래스를 컴파일러에 알려줍니다.

private-현재 클래스 만 필드 또는 메소드에 액세스 할 수 있습니다.

protected-이 클래스의 현재 클래스 및 서브 클래스 (및 때로는 동일한 패키지 클래스) 만 필드 또는 메소드에 액세스 할 수 있습니다.

public-모든 클래스는 필드를 참조하거나 메소드를 호출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.