update : 2015.11.03
php.shukuma.com

검색:
 
 
기초

기초

클래스

클래스 정의는 class 키워드로 시작합니다. 그 다음으로 클래스명, 마지막으로 클래스의 프로퍼티 정의와 메서드 정의를 감싸는 curly brace 쌍이 뒤따릅니다.

클래스명은 유효한 이름 이어야 하며, PHP에 예약된 이름reserved word도 아니어야 합니다. 유효한 클래스명은 하나의 글자나 언더스코어로 시작하고, 이어 여러개의 문자,숫자,언더스코어가 뒤따라야 합니다. 정규표현식으로 표현하자면 다음과 같이 표현합니다.: ^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$.

클래스는 클래스만의 상수, 변수 를 가질 수(이른바 "프로퍼티") 있습니다. 그리고, 함수를 가질 수(이른바 "메서드") 있습니다.

Example #1 간단한 클래스 정의

<?php
class SimpleClass
{
    
// 프로퍼티 정의
    
public $var 'a default value';

    
// 메서드 정의
    
public function displayVar() {
        echo 
$this->var;
    }
}
?>

$this 는 이 클래스가 인스턴스화 되었을 때에만 사용될수 있습니다. $this 는 객체에 대한 참조입니다.(보통은 해당 메서드를 소유하는 객체이지만, 다른 객체일 수도 있습니다. 메서드가 다른 객체내부에서 정적으로 불려지는 경우가 그러합니다.)

Example #2 $this 에 대한 몇가지 예제

<?php
class A
{
    function 
foo()
    {
        if (isset(
$this)) {
            echo 
'$this is defined (';
            echo 
get_class($this);
            echo 
")\n";
        } else {
            echo 
"\$this is not defined.\n";
        }
    }
}

class 
B
{
    function 
bar()
    {
        
// Note: 다음 라인은 E_STRICT 가 활성화 되었을 경우 warning을 발생시킵니다.
        
A::foo();
    }
}

$a = new A();
$a->foo();

// Note: 다음 라인은 E_STRICT 가 활성화 되었을 경우 warning을 발생시킵니다.
A::foo();
$b = new B();
$b->bar();

// Note: 다음 라인은 E_STRICT 가 활성화 되었을 경우 warning을 발생시킵니다.
B::bar();
?>

위 예제의 출력:

$this is defined (A)
$this is not defined.
$this is defined (B)
$this is not defined.

new

클래스의 인스턴스를 생성하기 위해서는 new 키워드를 사용해야 합니다. 생성자 가 정의되어 있는한 객체가 생성될것이고, 에러가 발생하면 예외를 발생시킬 것입니다. 클래스가 인스턴스화 되기 위해서는 미리 정의 되어 있어야 합니다.(필수가 되는 경우가 있습니다.)

만약에 클래스명을 포함하는 문자열 변수가 있다면 new 와 함께 사용할수 있습니다. 해당 클래스의 새로운 인스턴스가 생성될 것입니다. 만약에 클래스가 네임스페이스내에 속한다면, 완전한 이름을 사용해야 합니다.

Example #3 인스턴스 생성

<?php
$instance 
= new SimpleClass();

// 변수를 사용해서 가능합니다.:
$className 'SimpleClass';
$instance = new $className(); // new SimpleClass()
?>

클래스 컨텍스트 내에서는 new selfnew parent 를 통해 새로운 객체를 생성하는게 가능합니다.

이미 생성된 클래스의 인스턴스를 새 변수에 할당할때, 새 변수는 이미 할당된 동일한 객체의 인스턴스에 접근하게 될것입니다. 이것은 함수로 인스턴스를 넘길때에도 동일하게 동작합니다. 이미 생성된 객체를 복사하는것은 복제 를 통해 가능할 것입니다.

Example #4 객체 할당

<?php

$instance 
= new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance;

$instance->var '$assigned will have this value';

$instance null// $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

위 예제의 출력:

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned will have this value"
}

PHP 5.3.0 에서는 객체 인스턴스를 생성하는 다른 방법이 소개 되었습니다.:

Example #5 새로운 객체 생성

<?php
class Test
{
    static public function 
getNew()
    {
        return new static;
    }
}

class 
Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 Child::getNew();
var_dump($obj4 instanceof Child);
?>

위 예제의 출력:

bool(true)
bool(true)
bool(true)

확장

클래스는 다른 클래스로부터 메서드와 프로퍼티 를 extends 키워드를 사용하여 선언함으로써 상속받을수 있습니다. 다수의 클래스로부터 상속받는것은 가능하지 않습니다; 단 하나의 기본 클래스로부터 상속을 받을 수 있습니다.

상속된 메서드와 프로퍼티는 부모클래스의 정의된 이름과 똑같은 이름으로 재정의 될수 있습니다. 하지만, 부모 클래스의 메서드가 final 로 정의 되어 있다면, 재정의 될수 없습니다. 재정의된 원래의 메서드나 정적 프로퍼티는 parent:: 로 접근할 수 있습니다.

메서드를 재정의할때, 파라미터는 원래의 메서드와 동일해야 하며, 그렇지 않을 경우 E_STRICT 레벨 에러를 발생시킬 것입니다. 생성자는 이와 다르게, 파라미터가 달라도 재정의 가능합니다.

Example #6 간단한 클래스 상속

<?php
class ExtendClass extends SimpleClass
{
    
// Redefine the parent method
    
function displayVar()
    {
        echo 
"Extending class\n";
        
parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

위 예제의 출력:

Extending class
a default value

::class

PHP 5.5 이후에는 class 키워드로 클래스의 이름을 알아낼수 있습니다. ClassName 의 완전한 클래스명을 ClassName::class 를 이용해서 얻어낼 수 있습니다. 특히, 네임스페이스를 갖춘 클래스일 경우 유용합니다.

Example #7 클래스명 확인

<?php
namespace NS {
    class 
ClassName {
    }
    
    echo 
ClassName::class;
}
?>

위 예제의 출력:

NS\ClassName