get_class()

오브젝트를 넘겨 클래스 이름을 반환하는 함수.

class Foo
{
    public function echoName()
    {
        // 클래스 내부에선 파라메터를 지정하지 않고 자기자신을 지칭
        echo "My name is ".get_class()."\n";
    }
}


$foo = new Foo();
$foo->echoName();

// 클래스 외부에선 이름을 알고자 하는 오브젝트를 파라메터로 넘김
echo get_class($foo)."\n";

/*
[출력결과]
My name is Foo
Foo
*/



상속된 클래스 내부에서 사용하게 될 경우 파라메터에 $this를 지정해줘야 정확히 자기 자신을 지칭.

class Bar
{
    public function echoName()
    {
        printf("[1] \$this = %s\n", get_class($this));
        printf("[2] blank  = %s\n", get_class());
    }
}

class Foo extends Bar
{
}

$Foo = new Foo();
$Foo->echoName();

/*
[출력결과]
[1] $this = Foo
[2] blank  = Bar
*/







get_called_class()

late static binding 된 클래스 이름을 반환.

static 클래스에서 정확히 자기 자신을 지칭하기 위해선 반드시 get_called_class() 함수를 써야함.

abstract class Bar
{
    public static function echoName()
    {
        echo 'get_class = '.get_class()."\n";
        echo 'get_called_class = '.get_called_class()."\n";
    }
}

class Foo extends Bar
{
}

Foo::echoName();

/*
[출력결과]
get_class = Bar
get_called_class = Foo
*/







get_parent_class()

조상 클래스 이름을 반환하는 함수.

class Ancestor
{
    public function echoParentName()
    {
        echo "My name is ".get_class($this).", my parent name is ".get_parent_class($this)."\n";
    }
}

class Descendant1 extends Ancestor
{

}

class Descendant2 extends Descendant1
{

}

$aClass = array();
$aClass[] = new Ancestor();
$aClass[] = new Descendant1();
$aClass[] = new Descendant2();

$sMethod = 'echoParentName';
foreach ($aClass as $obj) {
    $obj->$sMethod();
}

/*
[출력결과]
My name is Ancestor, my parent name is 
My name is Descendant1, my parent name is Ancestor
My name is Descendant2, my parent name is Descendant1
*/


여러 가지로 응용이 가능한데 아래는 상속구조를 간단하게 출력하는 예제.

class A
{
}

class B extends A
{
}

class C extends B
{
}

class D extends C
{
}

$descendantName = 'D';
$ancestorList = getAllAncestor($descendantName);
echo implode(' -> ', $ancestorList).' -> '.$descendantName."\n";

// 최상위 조상까지 다 반환하는 함수
function getAllAncestor($obj)
{
    $ancestorList = array();
    while (($ancestor = get_parent_class($obj)) !== false) {
        array_unshift($ancestorList, $ancestor);

        $obj = $ancestor;
    }

    return $ancestorList;
}

/*
[출력결과]
A -> B -> C -> D
*/







is_subclass_of()

arg1이 arg2의 subclass인지 여부 반환.

class A
{
}

class B extends A
{
}

class C extends B
{
}


$A = new A();
$B = new B();
$C = new C();

checkSubClass('B', 'A');
checkSubClass('C', 'B');
checkSubClass('C', 'A');
checkSubClass('B', 'B');


function checkSubclass($child, $parent)
{
    $result = (is_subclass_of($child, $parent) === true) ? 'true' : 'false';

    echo $child.' is subclass of '.$parent.' = '.$result."\n";
}

/*
[출력결과]
B is subclass of A = true
C is subclass of B = true
C is subclass of A = true
B is subclass of B = false
*/





[참조]

Classes/Object Functions








Posted by bloodguy
,