programing

퍼블릭, 프라이빗 및 프로텍트의 차이점은 무엇입니까?

nicegoodjob 2023. 1. 26. 11:34
반응형

퍼블릭, 프라이빗 및 프로텍트의 차이점은 무엇입니까?

, 왜 ''를 해야 하나요?public,private , , , , 입니다.protected수와변 변수 ?래 ?? ????들의의 ?? ?? ?? ??? ??

예:

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

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

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

사용방법:

  • public오브젝트의 모든 장소, 다른 클래스 및 인스턴스에서 해당 속성/클래스를 사용할 수 있도록 하는 범위입니다.

  • private해당 클래스에서만 속성/클래스를 표시할 수 있습니다.

  • protected부모 클래스를 포함한 현재 클래스를 확장하는 모든 클래스에서 속성/클래스를 표시하는 경우.

가시성 수식자를 사용하지 않으면 속성/메서드가 공개됩니다.

상세: (포괄적인 정보 참조)

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 및 에 액세스 하려면 , 「」를 참조해 주세요.

  • 선언한 것과 같은 클래스입니다.
  • 위의 선언된 클래스를 상속하는 클래스입니다.

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

예:

<?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:Daddy:$name
인 오류: 개인 GrandPa 수 . GrandPa::$name은(는) 액세스할 수 없습니다.


Reflection을 사용하여 할아버지 클래스 해부

이 주제는 실제로 범위를 벗어난 것이 아닙니다. 반사가 정말 강력하다는 것을 증명하기 위해 여기에 추가했습니다.위의 세 가지 예에서 언급했듯이,protected ★★★★★★★★★★★★★★★★★」private멤버(속성 및 메서드)는 클래스 밖에서 액세스할 수 없습니다.

단, 반성을 통해 클래스 외부 멤버에 접속하여 엑스트라 일반을 할 수 있습니다!

자, 반사가 뭐죠?

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

프리암블

에는 리는 named named named named named named named named named named named named named named named named named named named named라는 수업이 있어요.Grandpas3시 정각알기 쉽게 하기 위해 이름을 가진 세 명의 할아버지가 있다고 생각해 봅시다.

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

수식어 )public,protected ★★★★★★★★★★★★★★★★★」private각각 다음과 같다.은 잘 알고 있습니다.protected ★★★★★★★★★★★★★★★★★」private클래스 밖에서 멤버에 액세스할 수 없습니다.아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

코드

<?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

일반적인 오해:

아래 예시와 혼동하지 마세요.와 같이, 「」는, 「 」를 참조해 주세요.private ★★★★★★★★★★★★★★★★★」protected반성을 사용하지 않고는 클래스 외부에서 멤버에 액세스할 수 없습니다.

<?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디버거 함수입니다.변수에 대한 정보를 사람이 읽을 수 있는 형태로 제공합니다.이 세 가지 기능을 통해protected ★★★★★★★★★★★★★★★★★」privatePHP 5가 있는 개체의 속성. 정적 클래스 구성원은 표시되지 않습니다.


기타 자원:


private에서만 액세스 할 수. - 클래스 내에서만 할 수 있습니다.

protected- 및 할 수

public 할 수 . - 외부 코드에서도 할 수 있습니다.

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

일반적으로 데이터 캡슐화와 우수한 인터페이스 설계를 촉진하기 위해 필요한 최소 가시성을 기본값으로 설정하는 것이 좋습니다.멤버 변수 및 메서드 가시성을 고려할 때 멤버가 다른 오브젝트와의 상호작용에서 수행하는 역할을 고려합니다.

「실장이 아닌 인터페이스에 코드」를 붙이는 경우는, 통상은 가시성을 판단하는 것이 매우 간단합니다.일반적으로 변수를 노출해야 할 정당한 이유가 없는 한 변수는 비공개로 하거나 보호해야 합니다.대신 퍼블릭액세서(getters/setters)를 사용하여 클래스의 내부 접근을 제한 및 규제합니다.

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

운전자는 이러한 행동이 자동차 내부에 의해 어떻게 구현되는지 알지 못하거나 신경써서는 안 되며, 그러한 기능을 노출하는 것은 운전자와 도로에서 다른 사람들에게 위험할 수 있습니다.따라서 퍼블릭인터페이스를 설계하고 그 인터페이스의 배후에 데이터를 캡슐화하는 것이 좋습니다.

또, 이 어프로치를 사용하면, 클라이언트 코드와의 인터페이스의 계약을 위반하지 않고, 클래스의 퍼블릭 메서드의 실장을 변경 및 개선할 수 있습니다.를 들어, 이렇게 , 하다, 하다, 하다, 이런 식으로 할 수 있습니다.accelerate()이 방법은 연비가 향상되지만 그 방법은 그대로입니다.클라이언트 코드를 변경할 필요는 없지만 효율성 향상의 이점을 얻을 수 있습니다.

편집: 아직 오브젝트 지향의 개념을 배우고 있는 것 같기 때문에(어느 언어의 구문보다 마스터가 훨씬 어렵습니다), Matt Zandstra의 PHP Objects, Patterns, Practice 사본을 선택하는 것을 강력히 추천합니다.이 책은 단순히 구문만 가르쳐주는 것이 아니라 OOP를 효과적으로 사용하는 방법을 처음으로 가르쳐준 책입니다.저는 몇 년 전에 구문을 배웠지만 OOP의 "왜"를 이해하지 못하면 소용이 없었습니다.

차이는 다음과 같습니다.

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

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

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

가시성 범위와 추상적인 예: 이해하기 쉬운

속성 또는 메서드의 가시성은 세 가지 키워드 중 하나(Public, protected, private)의 사전 수정 선언에 의해 정의됩니다.

Public : 속성 또는 메서드가 public으로 정의되어 있는 경우 오브젝트를 참조할 수 있는 임의의 방법으로 접근 및 조작할 수 있습니다.

  • 추상적 예:공공 가시성 범위를 누구나 참석할 수 있는 "공공 피크닉"으로 생각하십시오.

[Protected] : 속성 또는 메서드의 가시성이 보호됨으로 설정되어 있는 경우 클래스 자체 및 상속된 클래스 및 상속된 클래스에 의해서만 액세스할 수 있습니다.(상속:- 클래스는 다른 클래스의 모든 속성 및 메서드를 가질 수 있습니다).

  • 보호된 가시성 범위로 회사원 및 그 가족이 일반인이 아닌 "회사 피크닉"이라고 생각하십시오.가장 일반적인 범위 제한입니다.

[Private] : 속성 또는 메서드의 가시성을 [Private]으로 설정하면 클래스 관계에 관계없이 프라이빗 멤버를 가진 클래스만 이러한 메서드 및 속성에 액세스할 수 있습니다(클래스 내부).

  • 야유회에서 '회사원들만 갈 수 있는 회사 야유회'라고 생각하시면 됩니다.가족도 일반인도 허용되지 않습니다.
/**
 * 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

서 ⚡⚡의 를 쉽게 할 수 있는 .public,protected ★★★★★★★★★★★★★★★★★」private.

다음과 같습니다PUBLIC.

  • publicscope:할 수 .범위: 퍼함함함 / 수른른른른른른 。

다음과 같습니다PROTECTED.

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

다음과 같습니다PRIVATE.

  • privatescope: 변수되어 있는 됩니다.scope : 함함함함함 / where where where where where where where where where 。
  • 아니요! 현재 클래스를 확장하는 클래스는 이 범위에 액세스할 수 없습니다.
  • 아니요! 개체가 이 범위에 액세스할 수 없습니다.

PHP 설명서에서 메서드 또는 변수의 가시성을 읽어 보십시오.

'언제'를 고려:
처음에는 모든 것을 비공개로 선언하는 경향이 있어요. 확실치 않다면요.그 이유는 보통 개인 메서드를 공개하는 것이 그 반대보다 훨씬 쉽기 때문입니다.그 이유는 적어도 프라이빗 메서드는 클래스 자체에서만 사용되었음을 확인할 수 있기 때문입니다.퍼블릭 메서드는 이미 모든 곳에서 사용되고 있기 때문에 광범위한 재작성이 필요할 수 있습니다.

업데이트: 디폴트 설정:protected요즘은 캡슐화하기에 충분하고 (어차피 피하려고 하는) 수업을 연장할 때 방해가 되지 않는다는 것을 알게 되었기 때문입니다.내가 다른 두 개를 사용할 좋은 이유가 있을 때만, 나는 할 것이다.

★★★★★★★★★★★★★★★★★의 타당한 이유private메서드는 확장 클래스도 변경할 수 없는 오브젝트 고유의 무엇인가를 실장하는 메서드입니다(내부 상태 관리 등 캡슐화에 가세해 이유).protected되고 있기 로는 「Method」로 되어 .protected%인 ''100% 객관적인 "참호 속" 경험은 아닐지도 모릅니다.

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

Public(공용): 이 변수는 코드의 어디에서나 직접 액세스하여 변경할 수 있습니다.

클래스 외부에서 사용하는 예:

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

보호:다른 프로그래머(및 사용자 자신)가 변수에 액세스하여 설정할 때 클래스 외부에서 getters/setters를 사용하도록 강제하려면 이 옵션을 사용합니다(단, 일관성을 유지하고 클래스 내에서 getters 및 setters를 사용해야 합니다).이거 아니면private기본적으로는 모든 클래스 속성을 설정해야 합니다.

왜냐고? 향후 어느 시점(약 5분 이내)에 해당 자산에 대해 반환되는 값을 조작하거나 취득/설정하기 전에 해당 자산으로 반환되는 값을 조작하고 싶다고 결정하면 프로젝트에서 사용한 모든 부분을 리팩터링하지 않아도 되기 때문입니다.

클래스 외부에서 사용하는 예:

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

개인:private 유사하다protected but. ,, 징, 음, 음, 음, 음, 음,, 음, 음, 이다.private또한 부모 클래스의 getter 또는 setter를 사용하지 않으면 자식 클래스에 액세스할 수 없습니다.

기본적으로하고 있는 경우(수 에는 getter setter를 수 (「」).private다른 사람이 직접 사용하려 하지 않고 버그를 발생시키는 것을 방지하기 위해서입니다.

자식 클래스 내(MyObject를 확장하는) 사용 예:

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

오래된 질문을 되살리는 것은 매우 좋은 방법이라고 생각합니다만, 정의하는 API에 대해서입니다.

  • public 것은 하시는 모든 의 일부입니다 API 。

  • protected- 속지 마세요, 이것도 API의 일부입니다!사용자는 하위 분류, 코드 확장 및 보호된 것으로 표시된 모든 것을 사용할 수 있습니다.

  • private·사유재산이나 방법은 얼마든지 변경할 수 있습니다.을 사용하다이것들만이 변화를 일으키지 않고 바꿀 수 있는 유일한 것입니다.

또는 Semver 용어로:

  • 의 ★★★★★★★public ★★★★★★★★★★★★★★★★★」protected메이저 변경으로 간주해야 합니다.

  • 정보 ★★★★★★★public ★★★★★★★★★★★★★★★★★」protected 마이너(MINOR)((적어도)

  • 만 가능 (★★★★★★★★★★★★★★★★★★★★★★★★★★)private가 될 수 .

코드 는 어떤 때 하는 것이 .public ★★★★★★★★★★★★★★★★★」protected사용자들에게 약속하는 것들이기 때문입니다.

PHP 매뉴얼은 이 질문을 잘 읽고 있습니다.

속성 또는 메서드의 가시성은 선언 앞에 public, protected 또는 private 키워드를 붙이면 정의할 수 있습니다.공개로 선언된 클래스 구성원은 어디에서나 액세스할 수 있습니다.보호되었다고 선언된 구성원은 클래스 자체 내에서만 액세스할 수 있으며 상속된 클래스와 상위 클래스에서만 액세스할 수 있습니다.비공개로 선언된 멤버는 멤버를 정의하는 클래스에서만 액세스할 수 있습니다.

다양한 수준의 캡슐화를 가능하게 합니다.

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

Public : 이은 모든 할 수 있으며 시 : as public public 、 public public public public 。뭇매를 맞다public $examTimeTable;

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

으로 사용되다: 일반 사용법::

protected $familyWealth;

프로젝트에서 객체 지향의 php를 따를 때는 몇 가지 규칙에 따라 php에서 액세스 수식자를 사용해야 합니다.오늘은 액세스 수식어가 무엇인지, 어떻게 사용하는지 명확히 배워보겠습니다.PHP 액세스 수식자는 클래스 범위 내에서 정의된 함수 및 변수인 PHP 클래스와 해당 멤버에 대한 액세스 권한을 설정하는 데 사용됩니다.php에는 클래스 멤버의 스코프가 3개 있습니다.

  1. 일반의
  2. 사적인
  3. 보호되고 있다

다음 이미지를 보고 액세스 수식자 액세스레벨을 이해하겠습니다

다음으로 액세스 수식자로 사용할 수 있는PHP 키워드에 대해 알아보겠습니다.

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

private :- 클래스 멤버는 이 키워드를 사용하여 클래스 내에서 접근합니다.하위 클래스에서 개인 데이터에 액세스할 수 없습니다.외부 클래스 액세스로부터 구성원을 보호합니다.

protected : 서브클래스가 보호된 슈퍼클래스 멤버에 접근할 수 있도록 하는 것을 제외하고 프라이빗과 동일합니다.

이제 액세스 수식자를 이해하기 위한 표를 참조하십시오. 전체 기사 php 액세스 수식어를 읽습니다.

Public메서드를 할 때 로, 수 변수 또는 메서드를 선언할 때 기본 상태로, 개체에 직접 액세스할 수 있습니다.

Protected: 오브젝트 및 서브클래스 내에서만 접근할 수 있습니다.

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

위의 키워드는 액세스 수식자이며 캡슐화(또는 정보 숨김) 구현에 도움이 됩니다.정의되고 있는 필드 또는 메서드에 액세스 할 수 있는 다른 클래스가 컴파일러에 지시됩니다.

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

protected - 이 클래스의 현재 클래스 및 하위 클래스(경우에 따라서는 동일한 패키지 클래스)만 필드 또는 메서드에 액세스할 수 있습니다.

public - 임의의 클래스가 필드를 참조하거나 메서드를 호출할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4361553/what-is-the-difference-between-public-private-and-protected

반응형