PHP5의 액세스 방법을 사용하면 클래스 멤버에 대한 액세스를 제한할 수 있습니다. 이는 PHP5의 새로운 기능이지만 이미 많은 객체 지향 언어에 존재합니다. 액세스 방법을 사용하면 안정적인 객체 지향 애플리케이션을 개발하고 재사용 가능한 객체를 구축할 수 있습니다.
C++ 및 Java와 마찬가지로 PHP에는 public, private 및 protected라는
세 가지 액세스 방법이 있습니다. 액세스 방법을 지정하지 않으면 기본적으로 액세스가 가능합니다. 메서드는 public입니다. static 키워드(예: public static) 앞에 액세스 메서드를 배치하여 정적 멤버에 대한 액세스 메서드를 지정할 수도 있습니다.
클래스 외부의 모든 코드는 공용 속성을 읽고 쓸 수 있습니다. . 이전 버전의 PHP에서는 모든 메소드와 속성이 공개되어 객체가 잘 구조화된 배열처럼 느껴지도록 했습니다.
클래스 내에서만 볼 수 있습니다.
마찬가지로, 동일한 클래스 내의 메소드만 상속된 하위 클래스에
있는 비공개 멤버에 액세스할 수 없습니다.
클래스는 비공개 멤버에 액세스할 수 있습니다. 예 6.8을 참조하세요. == 연산자는 동일한 클래스의 두 위젯을 비교하지만 이 예에서는 각 개체 인스턴스가 고유한 ID를 갖습니다.
및 가격. Java와 C 모두<?php에서
다른 Widget 인스턴스의 비공개 속성에 액세스하는 방법을 확인하세요.
클래스위젯
{
비공개 $name;
비공개 $ 가격;
비공개 $id;
공개 함수 __construct($name, $price)
{
$this->이름 = $이름;
$this->price = floatval($price);
$this->id = uniqid();
}
//두 위젯이 동일한지 확인합니다. 두 위젯이 동일한지 확인합니다.
공개 함수는 같음($widget)
{
return(($this->name == $widget->name)AND
($this->가격 == $widget->가격));
}
}
$w1 = new Widget('Cog', 5.00);
$w2 = new Widget('Cog', 5.00);
$w3 = new Widget('기어', 7.00)
//TRUE
if($w1->같음($w2))
{
print("w1과 w2는 같습니다n");
}
//거짓
if($w1->같음($w3))
{
print("w1과 w3은 같습니다n");
}
//FALSE, == 비교 시 ID를 포함합니다.
if($w1 == $w2) //ID가 다르기 때문에 같지 않습니다.
{
print("w1과 w2는 같습니다n");
}
?>
객체 지향 프로그래밍을 처음 접하는 경우 전용 멤버를 사용하는 목적이 무엇인지 궁금할 수 있습니다. 이 장의 시작 부분에서 프라이빗 멤버를 사용하여 데이터를 캡슐화하는 방법에 대해 논의한 적이 있을 것입니다.
. 클래스 외부의 코드에서 액세스하지 않고도 클래스 내부에 숨길 수 있습니다. 또한 데이터 구조 외부의 코드가 내부 속성에 직접 액세스할 수 없는 경우에는대부분
암시적인 관계가 없습니다.
비공개 속성은 여전히 외부 코드에서 공유될 수 있습니다. 해결책은 한 쌍의 공개 메소드를 사용하는 것입니다. 하나는 get(속성 값 가져오기)이고 다른 하나는 설정(속성 값 설정)입니다. 이는 좁고 검증된 인터페이스를 통해 멤버 간의 통신이 이루어질 수 있도록 하며, 또한 메서드에 전달된 값을 변경할 수 있는 기회도 제공합니다. 예제 6.8에서 생성자가 가격을 float Number(floadval( ))
보호된 멤버는 동일한 클래스 및 상속된 클래스의 모든 메서드에서 액세스할 수 있습니다. 공용 속성을 사용하면 하위 클래스가 보호된 메서드에 종속될 수 있으므로 이러한 문제가 발생하지 않습니다. 보호된 메소드를 사용하려면 상위 클래스의 구조를 명확히 해야 합니다.
이제 Widget에는 getName이라는 보호된 메소드가 있다는 점에 유의하세요. Widget의 인스턴스가 보호된 메소드를 호출하려고 하면 $w1->getName( )은 오류를 생성합니다. 그러나 Thing 하위 클래스의 getName 메서드는 이 보호된 메서드를 호출할 수 있습니다. 물론 Widget::getName 메서드가 보호된다는 것을 증명하기 위해 이 예제는 실제 상황에서 보호된 메서드를 사용하는 방법에 따라 달라집니다. 물체의 내부 구조를 이해한다.
<?php
클래스위젯
{
비공개 $name;
비공개 $ 가격;
비공개 $id;
공개 함수 __construct($name, $price)
{
$this->이름 = $이름;
$this->price = floatval($price);
$this->id = uniqid();
}
//두 위젯이 동일한지 확인합니다.
공개 함수는 같음($widget)
{
return(($this->name == $widget->name)AND
($this->가격 == $widget->가격));
}
보호된 함수 getName()
{
return($this->이름);
}
}
클래스 사물이 위젯을 확장함
{
비공개 $color;
공개 함수 setColor($color)
{
$this->color = $color;
}
공개 함수 getColor()
{
return($this->color);
}
공개 함수 getName()
{
return(부모::getName());
}
}
$w1 = new Widget('Cog', 5.00);
$w2 = 새로운 사물('코그', 5.00);
$w2->setColor('Yellow');
//TRUE (여전히!) 결과는 여전히 true입니다.
if($w1->같음($w2))
{
print("w1과 w2는 같습니다n");
}
//코그 출력 코그 인쇄
print($w2->getName());
?>
하위 클래스는 상위 클래스 메서드를 재정의하여 메서드에 액세스하는 방식을 변경할 수 있습니다. 그러나 여전히 몇 가지 제한 사항이 있습니다. 비공개 멤버는 여전히 현재 클래스에서만 볼 수 있습니다. 따라서 상위 클래스의 비공개 멤버와 동일한 이름을 가진 멤버를 선언하면 기술적으로는 다른 멤버가 생성됩니다.
Final 키워드는 멤버 메서드에 대한 액세스를 제한하는 또 다른 방법입니다. 하위 클래스는 상위 클래스에서 final로 표시된 메서드를 재정의할 수 없습니다
.