PHP기반의 OOP (interface활용) by Vins

<?php
interface INamed
{
public function getName();
}
interface ISon
{
public function getFather();
}
interface IFather
{
public function getSons();
}
abstract class Named implements INamed
{
protected $name;
public function __construct($name)
{
$this->name = $name;
}
public function __destruct()
{}
public function getName()
{
return $this->name;
}
}
abstract class Son implements ISon
{
protected $father;
public function getFather()
{
return $this->father;
}
public function __construct($father = null)
{
$this->father = $father;
}
public function __destruct()
{}
}
abstract class Father implements IFather
{
protected $sons = array();
public function getSons()
{
return $this->sons;
}
public function __construct($sons = array())
{
$this->sons = $sons;
}
public function __destruct()
{}
}
class Man implements INamed, ISon, IFather
{
public function __construct($name, $father = null, $sons = array())
{
Named::__construct($name);
Son::__construct($father);
Father::__construct($sons);
}
public function __destruct()
{
Named::__destruct();
Son::__destruct();
Father::__destruct();
}
public function getFather()
{
return Son::getFather();
}
public function getSons()
{
return Father::getSons();
}
public function getName()
{
return Named::getName();
}
}

$siarhej = new Man('Siaroh', new Man('Adas'), array(new Man('Seva'),new Man('Davin')));
echo $siarhej->getName()."<br>";
echo $siarhej->getFather()->getName()."<br>";
if (is_array($siarhej->getSons())){
$siarhejSons = $siarhej->getSons();
foreach($siarhejSons as &$val) {
echo $val->getName()."<br>";
}
}
?>


PHP interface 를 이용하는 샘플이다.

abstract 클래스로 interface를 구현(implements)하고

실제 메인 클래스인 Man클래스에서 각 3개의 인터페이스만 상속 받아

이를 구현한 예제이다.



PHP5.0에서 새로 등장한 생성자(__construct)와 소멸자(__destruct)의 역활 정의에서

위에서 abstract 클래스로 구현(implements)했었던 클래스들을 호출하고 있는 것을 볼수 있다.



이런식으로 interface(인터페이스)를 사용하여 상속을 구현하게 되면

class간의 종속성은 낮아지고 수정 변경에 유동적으로 대응 할 수 있게 된다.

즉 일반적인 클래스 상속의 경우 Parent Class, Child Class 관계에서

Parent class 의 메소드나 멤버들을 수정해야 할 경우 Child Class에 그 영향이 미치게 되고

이는 웹사이트 전체적인 종속성의 문제로 흔히 말하면 "이거 바꾸면 다 바꿔야 해서 불가능해요~"

"시간안에 수정하기가 힘들고 어떤 버그가 발생할 지 예상할 수가 없어요 ~" 등

문제가 발생하게 된다.

이로 인한 부분을 해소 하기 위해서 interface를 생성하고 이를 구현(implements)되면

이런 부분을 다소 해소 할 수 있게 된다.

interface를 설명하는 책이나 레퍼런스를 보면 다중상속의 예를 볼수가 있는데

우리가 착각하고 있는 것중 하나가 다중상속을 구현하기 위해서 interface를 사용하는 것이라는 오해하는 것이다.

다중 상속은 interface가 가지는 하나의 특징이고 interface는 클래스간 종속성을 낮추고

결합도를 높이기 위한 것이다.



현업에서 이런 부분에 대한 고려는 곧 기획의 유동성을 보장할 수 있으며

include or require 등 함수 기반의 공용 모듈이 가지는 불합리성을 해소 할 수 있다.



PHP의 OOP에 대한 개념에 있어서 회의적인 시각이 많았지만. PHP5버젼 부터

객체지향을 문법적(PHP4까지)인 지원이 아닌 실체 객체화를 할 수 있는 개념이 본격적으로

도입되었고 차후 버젼에서 더 많은 객체 지향을 위해서 많은 것이 지원될 것을 기대한다.



아직 Java, C#등 다른 OOP언어에 비해서 많은 부분이 모자란 것은 사실이다.

웹 언어의 구조적 문제로 PHP같은 경우 변수선언의 자동화라는 개념 때문에

오버로딩 지원 안된다든지 이런 제약을 가지고 있다 .

물론 이것들을 피해가는 방법으로 많은 꽁수들이 나와 있긴 하지만. (인자를 1개->2개로 늘린다든지)

아마 이런 문제가 해결 될려면 PHP 6? 또는 다음 버젼에서는 PHP도 변수 선언을 하지 않으면 안되는

컴파일 언어로서 재탄생을 하게 될 지 모른다.