private는 현재 자신의 클래스에서만 사용이 가능하다. 상속이 안된다.
하위클래스에서 사용하고 싶으면 중간 클래스에서 받아서 그 하위에서 사용 할 수 있게 전달해 주면 된다.
상속시 변수, 상수를 하위 클래스에서 사용해야 된다면 public 또는 protected 를 사용하면 된다.
클래스 상속시 변수,상수 사용
PHP에서는 상속 체인을 따라 부모의 부모, 그리고 그 이상의 상위 클래스에 정의된 변수에 직접 접근하는 방법은 제공하지 않습니다.
parent:: 키워드를 사용하면 바로 위의 부모 클래스에만 접근할 수 있습니다.
그렇기 때문에 PHP에서는 부모의 부모 클래스 등 상위 클래스의 인스턴스 변수들을 자식 클래스에서 직접 참조하는 것은 불가능하며, 간접적인 방법을 통해야 합니다.
상수의 사용
PHP에서 상수를 참조할 때는 $this->를 사용하지 않습니다. 대신 self::, parent::, 또는 static:: 키워드를 사용합니다.
self::는 자신의 클래스에 정의된 상수나 정적 속성, 메소드에 접근할 때 사용합니다.
parent::는 부모 클래스에 정의된 상수나 정적 속성, 메소드에 접근할 때 사용합니다.
static::은 "late static binding"이라고도 하는데, 이것은 호출한 실제 클래스에 접근하게 해주며, 이 기능은 PHP 5.3.0부터 도입되었습니다.
따라서 상수를 참조하려면 $this-> 대신 위에서 언급한 키워드들을 사용해야 합니다.
상수를 자식 클래스에서도 사용하려면, protected 또는 public으로 선언해야 합니다.
그러나 일반적으로 상수는 변경되지 않아야 하므로, public보다는 protected를 사용하는 것이 좋습니다.
변수의 접근
변수에 접근하기 위해서는 $this-> 키워드를 사용합니다.
parent::는 상수, 정적 속성 또는 메소드에 대해서만 사용됩니다.
상위 클래스의 생성자 호출
부모 클래스의 생성자를 실행하기 위해 parent::__construct()를 사용합니다. 이것은 부모 클래스의 생성자 메서드를 호출하는 방법입니다.
/**
* 클래스 상속시 상수,변수 사용 확인
* - 자식에서 부모의 상수를 호출 할때는 :: 이중콜론을 사용 한다.
*/
class GrandParent {
// private는 자식에서 사용할 수 없다.
protected const TEST = '할배-상수';
// private $grandPrivate= '할배-변수-프라이빗'; // 하위클래서 접근이 안된다.
protected $grandPtc = '할배-변수-protected';
public $grandPub = '할배-변수-퍼블릭';
function __construct() {
echo 'className: ' . __CLASS__ . ' - 할배: ' . self::TEST . PHP_EOL;
echo '--------------------------------------------------------' . PHP_EOL;
}
}
class Parent1 extends GrandParent {
protected const TEST = GrandParent::TEST;
function __construct() {
echo 'className: ' . __CLASS__ . ' - 할배1: ' . parent::TEST . PHP_EOL;
echo 'className: ' . __CLASS__ . ' - 부모: ' . self::TEST . PHP_EOL;
echo '--------------------------------------------------------' . PHP_EOL;
}
}
class Child extends Parent1 {
public function __construct() {
echo 'className: ' . __CLASS__ . ' - 자식에서 부모 함수 호출:' . parent::__construct() . PHP_EOL;
echo 'className: ' . __CLASS__ . ' - 자식에서 할배 상수 호출:' . GrandParent::TEST . PHP_EOL;
echo 'className: ' . __CLASS__ . ' - 부모상수 호출: ' . parent::TEST . PHP_EOL;
echo '--------------------------------------------------------' . PHP_EOL;
// echo 'className: ' . __CLASS__ . ' - Child: ' . $this->$grandPrivate . PHP_EOL;
echo 'className: ' . __CLASS__ . ' - 자식에서 할배 변수 호출: ' . $this->grandPtc . PHP_EOL;
echo 'className: ' . __CLASS__ . ' - 자식에서 할배 변수 호출: ' . $this->grandPub . PHP_EOL;
echo '--------------------------------------------------------' . PHP_EOL;
}
}
new Child(); // Outputs: 123
exit;