본문 바로가기
프로그래밍/PHP

PHP 클래스 - 오버라이드(Override)

by pentode 2018. 4. 10.

PHP 클래스에서 오버라이드는(Override) 부모 클래스의 메소드를 재정의 하는 것을 뜻합니다. 재정의시에는 메소드명과 인자가 동일해야 합니다. 접근제어자는 같거나 더 많이 허용하는쪽으로 지정할 수 있습니다.

 

메소드명이 같은데 인자가 다르면 에러가 발생합니다. 다른 객체 지향언어는 메소드 오버로딩(overloading) 이라고 해서 메소드의 이름은 같고, 인자가 다른 메소드를 정의하여 주어지는 인자에 따라 다른 메소드가 호출되도록 할 수 있지만, PHP 는 오버로딩은 지원하지 않습니다.(PHP에도 오버로딩이라는 기능이 있습니다. 하지만, 이 기능은 일반적인 객체 지향 언어에서의 오버로딩과는 다른 기능 입니다.)

 

이 오버라이딩 규칙은 생성자(__constructor)에도 동일하게 적용됩니다.

 

 

class Vehicle {
	public $name = "Vehicle";

	public function getName() {
		return $this->name;
	}

	public function drive() {
		return "Vehicle drive";
	}
}

class Car extends Vehicle {
	public $name = "Car";

	public function getName() {
		return parent::getName() . " : " . $this->name;
	}

	public function drive() {
		return parent::drive() . " : " . "Car drive";
	}
}

$veh = new Vehicle();
$car = new Car();

echo($veh->getName());
echo("<br />\n");
echo($veh->drive());
echo("<br />\n");
echo($car->getName());
echo("<br />\n");
echo($car->drive());

결과)
Vehicle
Vehicle drive
Car : Car
Vehicle drive : Car drive

 

오라라이딩된 메소드 또는 생성자에서 parent 키워드를 사용해서 부모의 메소드, 생성자를 호출할 수 있습니다. 이때 사용되는 더블콜론(::) 연산자를 범위 결정 연산자 (Scope resolution operator)라고 부릅니다.

 

parent::drive();

 

자식 클래스에서 부모 클래스의 멤버변수와 동일한 이름의 멤버변수를 만들면 부모의 변수는 가려져서 접근할 수 없게 됩니다.

 

parent::$name 은 정적(static) 멤버일 경우에만 사용할 수 있습니다. parent::getName(); 또한 가려진 부모의 멤버변수에 접근할 수 없습니다. $this는 항상 현재 객체를 가리키기 때문입니다.

반응형