본문 바로가기

PHP/PHP Programming

[PHP] 클래스의 기본문법

반응형

■ 클래스의 기초


 클래스는 class 키워드로 시작하여 클래스 이름이 정의되고, 다음 중괄호 안에는 클래스의 속성과 메소드를 정의합니다. 클래스 이름은 다음과 같은 규칙을 따릅니다.


 

  √ 첫 글자가 문자나 밑줄로 시작해서 a ~ z, A ~ Z, 0 ~ 9, 언더라인( _ )이 붙는 127부터 255까지 길이인 클래스 이름을 갖습니다.

  √ 정규표현식 : ^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$



 클래스 안에는 상수와 변수, 함수를 사용할 수 있고, 메소드가 객체 컨테스트에서 호출되는 경우 자기 자신의 객체를 나타내는 $this 를 사용하여 호출합니다. $this 를 붙이지 않으면 일반 변수(로컬 변수)로 처리해 버립니다.



Tip : php5.3부터 변수를 사용하여 클래스 이름을 정의할 수 있습니다.


 ex #01)

<?php
    class test {

        // 다음 변수를 멤버 변수라 부릅니다.
        var $name = "Wicked";
        var $email = "yinglong200@me.com";

        function display() {
   
            echo $this -> name."<br/>\n";
            echo $email;
        }
    }

    $method = new test;
    $method -> display();
    // 출력 : Wicked
?>



 ex #02)

<?php
    class test {

        var $name = "Wicked";
        var $email = "yinglong200@me.com";

        function Cat() {
   
            echo $this -> name."&nbsp;";
            echo $this -> email;
        }

        function display() {

            $this -> Cat();
        }
    }

    $method = new test;
    $method -> display();
    // 출력 : Wicked yinglong200@me.com
?>





 



■ new 키워드



 new 키워드는 클래스의 인스턴스를 만들기 위해 사용합니다. new 키워드를 사용하여 클래스를 초기화하면 해당 클래스의 변수나 메소드를 호출하기 위해 -> 를 붙여 참조할 수 있습니다.



 ex #01)

<?php
    class test { }

    $instance01 = new test;
    $instance02 = new test;
?>


 ex #02)

<?php
    class test {
       
        function test() { }

        function profile($name) {

            echo "name : $name ";
        }
    }

    $instance = new test();
    $instance -> profile("Wicked");
    $instance -> profile("Miso");
    // 출력 name : Wicked name : Miso
 ?>


 ex #03)

<?php
    class test {
       
        function test() { }

        function profile($name) {

            echo "name : $name ";
        }
    }

    $instance01 = new test();
    $instance01 -> profile("Wicked");
   
    $instance02 = new test();
    $instance02 -> profile("Miso");
    // 출력 name : Wicked name : Miso
 ?>


 다음 예제처럼 객체를 참조하여 할당할 수도 있습니다.



 ex #04)

<?php
    class test {
       
        function test() { }

        function profile($name) {

            echo "name : $name ";
        }
    }

    $instance = new test();
   
    $a =& $instance;
    $a -> profile("Wicked");
    // 출력 : name : Wicked
 ?>









■ extends 키워드



 extends 키워드를 사용한다면 다른 클래스의 메소드와 속성을 상속(또는 확장) 할 수 있습니다. 단, 하나의 클래스만 상속할 수 있지만 다중 상속은 할 수 없습니다. 그러나 다른 클래스의 내용을 계승하여 새로운 클래스를 만들어 원래의 클래스를 수정하지 않고 확장 할 수 있다는 장점이 있습니다.


 ex #01)

<?php
    class test {
       
        var $name = "Wicked";
    }

    /*
        test 클래스는 부모 클래스라 하고,
        상속 받은 Simple 클래스를 자식 클래스라 합니다.
        test 클래스로 simple 클래스를 확장한 것이므로
        test 클래스의 멤버 변수나 메소드도 사용할 수 있습니다.
    */

    class simple extends test {
       
        function profile() {
           
            echo "name : ".$this -> name;
        }
    }

    $a = new simple();
    $a -> profile();    // 출력 : name : Wicked
 ?>


 ex #02)

<?php
    class test {
       
        var $name = "Wicked";

        function profile() {

            echo "name : ".$this -> name;
        }
    }
       
    class simple extends test {
       
        function output() {
           
            $this -> profile();
        }
    }

    $a = new simple();
    $a -> output();    // 출력 : name : Wicked
 ?>








public, protected, private 속성



 클래스의 멤버 변수를 속성이라 부르고, 속성을 정의하려면 public, protected, private 속성 중 하나의 키워드를 정의한 다음에 일반 변수를 선언합니다. 이 속성은 다음의 역할을 합니다.

 

 

  √ public : 클래스 내부, 서브 클래스, 그리고 클래스 외부에서 사용할 수 있고, var를 선언하거나 생략하면 public 을 선언한 것으로 간주합니다.

  √ protected : 클래스 내부, 서브 클래스에서만 사용할 수 있습니다.

  √ private : 클래스 내부에서만 사용할 수 있습니다.



 ex #01)
<?php
    class test {
       
        // 속성은 php5.1.3부터 사용할 수 있습니다.
        public $name = "Wicked";

        public function profile() {

            echo "name : ".$this -> name;
        }
    }
   
    $a = new test();
    $a -> profile();
    // 출력 : name : Wicked
 ?>


 ex #02)
<?php
    class test {
       
        // 속성은 php5.1.3부터 사용할 수 있습니다.
        public $name = "Wicked<br/>";

        public function profile() {

            echo "name : ".$this -> name;
        }
    }

    class simple extends test {
       
        public function output() {
           
            $this -> profile();
        }
    }
   
    $a = new test();
    $a -> profile();    // 출력 : name : Wicked

    $a = new simple();
    $a -> output();    // 출력 : name : Wicked
   
 ?>


 다음은 protected 사용의 예입니다.



 ex #03)

<?php
    class test {
       
        // 속성은 php5.1.3부터 사용할 수 있습니다.
        protected $name = "Wicked<br/>";

        protected function profile() {

            echo "name : ".$this -> name;
        }
    }
   
    // 클래스 내부와 서브 클래스에서만 사용할 수 있게
    // 정의하였으므로 클래스 밖에서는 사용할 수 없습니다.   
    $a = new test();
    $a -> profile();    // 출력 :   
 ?>








■ const 키워드



 const 키워드를 정의하면 클래스 상수를 만들 수 있습니다. 다만, 값을 변경할 수 없는 상수를 클래스에 정의할 수 있지만 변수의 값에(self::, parent::, static:: 같은)키워드를 지정할 수 없습니다.



 ex #01)
<?php
    class test {
       
        // 속성은 php5.1.3부터 사용할 수 있습니다.
        const name = "Wicked<br/>";

        function profile() {
           
            echo "name : ".self::name;
        }
    }
   
    class simple extends test {
       
        function output() {
           
            $this -> profile();
        }
    }

    $a = new test();
    $a -> profile();    // 출력 :  name : Wicked

    $b = new simple();
    $b -> output();    // 출력 :  name : Wicked

    echo $a::name;    // 출력 :  Wicked
 ?>


 ex #02)

<?php
    class test {

        const MY_NAME = "Wicked";
    }
   
    echo test::MY_NAME;
    // 출력 : Wicked
 ?>









■ 생성자(__construct( ))와 소멸자(__destruct( ))



 클래스의 생성자 __construct() 메소드를 선언할 수 있습니다. 생성자 메소드를 가진 클래스는 새로운 객체가 생성될 때마다 이 메소드를 호출합니다. 그러면 해당 객체를 사용하기 전에 초기화를 해줍니다.


 콘스트럭터(__construct( ))라고 부르는 생성자 메소드는 콘스트럭터 인수에 값을 넘기려면 초기화할 때 클래스 인수로 지정하면 되고, 소멸자 디스트럭터(__destruct( ))는 콘스트럭터의 역으로 객체가 소멸할 때 실행되는 메소드입니다. 객체가 참조할 필요가 없다면 자동 소멸됩니다.


 ex #01)
<?php
    class test {
       
        var $name = null;
        var $email = null;
        var $age = null;
   
        function __construct($a, $b, $c) {
           
            $this -> name = $a;
            $this -> email = $b;
            $this -> age = $c;
        }

        function profile() {
           
            printf("name %s(%s) %s<br/>", $this -> name, $this -> age, $this -> email);
        }
    }
   
    $a = new test("Wicked", "10", "id01");
    $b = new test("Miso", "20", "id02");
    $c = new test("Hayate", "30", "id03");

    $a -> profile();
    $b -> profile();
    $c -> profile();

    /*
        출력 :
            name : Wicked(id01) 10
            name : Miso(id02) 20
            name : Hayate(id03) 30
    */
?>







■ static 키워드


 static 키워드는 객체의 인스턴스를 생성하지 않고도 호출할 수 있게 해줍니다. 보통 멤버 변수를 사용하기 위해 $this 와 -> 를 사용해야 하지만 static 키워드가 선언된 메소드는 그럴 필요 없이 :: 로 접근할 수 있습니다.


 static 키워드로 선언도니 메소든느 반대로 $this 와 -> 로 엑세스할 수 없고, 메소드 내부에서도 이용할 수 없지만 static 이 선언된 변수를 내부에서 이용하려면 self 를 이용하면 됩니다.


 static가 아닌 메소드를 정적으로 호출하면 E_STRICT 레벨의 경고가 발생합니다.



TIP : php5.3부터 변수를 사용하여 클래스를 참조할 수 있지만 변수의 값에 (self::parent::, static:: 같은) 키워드를 지정할 수 없습니다.



 ex #01)
<?php
    class test {

        static $name = "Wicked";
        static $email = "yinglong200@me.com";
        static $age = "28";

        public static function profile() {
           
            printf("name %s(%s) %s<br/>", self::$name, self::$age, self::$email);
        }
    }

    echo test::$name;
    // 출력 Wicked

    test::profile();
    // 출력 : name Wicked(28) yinglong200@me.com
?>


 php5.3부터 변수를 사용하여 클래스를 호출할 수 있습니다.



 ex #02)
<?php
    class test {

        static $name = "Wicked";
        static $email = "yinglong200@me.com";
        static $age = "28";

        public static function profile() {
           
            printf("name %s(%s) %s<br/>", self::$name, self::$age, self::$email);
        }
    }

    $classname = "test";

    echo $classname::$name;
    // 출력 Wicked

    $classname::profile();
    // 출력 : name Wicked(28) yinglong200@me.com
?>







■ self(또는 parent) 키워드



 self(또는 parent) 키워드를 사용하면 정적 상속 컨텍스트에서 호출 클래스를 참조할 수 있습니다. self 키워드는 해당 메소드가 정의된 클래스 이름을 가져 올 수 있고, get_chlled_class() 함수를 사용하면 클래스 이름을 문자열로 가져옵니다.


 static:: 의 차이는 정적 속성만 참조할수 없다는 점을 제외하면 동일하고, parent:: self:: 같은 키워드를 사용하여 요청자의 정보를 전송할 수 있습니다.



 ex #01)
<?php
    class test {
       
        public static function who() {
           
            echo __CLASS__;
        }

        public static function output() {
           
            self::who();
        }
    }

    class simple extends test {
       
        public static function who() {
           
            //...
        }
    }

    simple::output();
    // 출력 : test
?>


 ex #02)
<?php
    class test {
       
        function __construct($child) {

            echo "I Was called by " . $child . "<br/>";
        }
    }

    class simple extends test {
       
        function __construct() {

            parent::__construct(__CLASS__);
        }

        function output() {
           
            echo "I am class " . __CLASS__;
        }
    }

    $a = new simple;
    // 출력 : I was called by simple

    $a -> output();
    // 출력 : I am class simple
?>







■ final 키워드



 final 키워드는 php5.0부터 사용할 수 있습니다. final 키워드를 클래스나 메소드에 정의하면 정의된 메소드는 자식 메소드에 재정의할 수 없고, 클래스 자체를 final로 정의된 경우 이 클래스를 상속에 사용할 수 없습니다. public 과 같은 속성에 final로 선언할 수 도 없습니다.


 ex #01)

<?php
    final class test {
       
        public function profile() {
           
            echo "name : Wicked";
        }
    }

    class simple extends test {
       
        function output() {
           
            $this -> profile();
        }
    }

    $a = new simple();
    $a -> output();

    // 출력 : Fatal error: Class simple may not inherit from final class (test) in ...\ex19.php on line 16
?>


 ex #02)
<?php
    final class test {
       
        public function profile() {
           
            echo "name : Habony";
        }
    }

    $a = new test();
    $a -> output();

    // 출력 : name : Habony
?>







■ 범위 정의 연산자 더블 콜론( :: )



 범위 정의 연산자 더블 콜론(::)은  static, 상수, 재정의된 클래스의 속성과 메소드에 액세스할 때 상요합니다. 클래스 내부에서 액세스하고자 할 때는 self:: 나 parent::, static::를 사용하면 됩니다.



 ex #01)
<?php
    class test {
       
        const CONST_VALUE = 'Wicked';
    }

    echo test::CONST_VALUE;

    // 출력 : Wicked
?>


 ex #02)

<?php
    class test {
       
        const CONST_VALUE = 'my name is';
    }

    class simple extends test {
       
        public static $my_static = 'Wicked;';

        public static function my_name() {
           
            echo parent::CONST_VALUE."&nbsp;";
            echo self::$my_static."<br/>";
        }
    }

    // php5.3부터 변수를 사용하여 클래스를 참조할 수 있습니다.
    $classname = 'simple';
    echo $classname::my_name();
    // 출력 : my name is Wicked;

    simple::my_name();
    // 출력 : my name is Wicked;
?>


반응형

'PHP > PHP Programming' 카테고리의 다른 글

[PHP] 디렉터리 열기 함수  (0) 2015.04.19
[PHP] 세션 쿠키 설정 함수  (0) 2015.04.08
[PHP] 상수의 정의  (0) 2015.03.31
[PHP] 가변변수  (0) 2015.03.29
[PHP] 정적변수  (0) 2015.03.29