반응형

1. 클래스를 생성할때 클래스에 인수를 넘기는게 있던데 어떻게 받는건지;;

예를들어서 $test = new Class("test");

이런식으로 인수를 넘기면 어떻게 받는지 궁금하구요

 

 - 객체 생성시 클래스로 넘기는 인수는 PHP5 의 경우 클래스내에 __construct() 라는 생성자 함수로 넘어가게 되며 PHP4 는 클래스 이름과 동일한 이름의 함수가 생성자 역활을 하므로 해당 함수로 넘어가게 됩니다.

 

예)

class test {

    function __construct($a) {

        echo $a;

    }

}

 

$t = new test('Hello');

 

객체 생성과 함께 화면에 Hello 라고 출력됩니다.

 

 

 

2. 클래스 함수등에 엠퍼센트(&)를 붙여서 쓰는게 있던데 이건 어디에 쓰는건지 모르겠어요

예를 들어서 $test->&test("test");

이런건 어디에 쓰고 또 어떻게 쓰는건지 알려주세요

 

- 우선 질문에 적으신 $test->&test("test") 는 문법 오류를 발생시킵니다. 엠퍼센트가 위치할 곳은 맨 앞쪽입니다.

&$test->test(); 와 같이요. 이 같은 사용법은 약간은 다르지만 C 에서 포인터와 비슷합니다. 즉 어떠한 값이 복사가 되는 것이 아니고 그 값을 가리키는 새로운 이름이 생성되는 것과 같습니다. 아래 예를 보세요.

 

$a = 1;

$b = $a;

 

위와 같이 했을 때 $b 가 같은 값인 1을 가지고 있긴 하지만 메모리 상에서는 다른 값으로 처리됩니다. 즉 $b 변수에 값이 대입될 때 $a 에 있는 값과 동일한 값을 메모리상 새로운 공간에 저장을 한다는 것이죠. 하지만...

 

$a = 1;

$b = &$a;

 

위와 같이 처리하면 $a 와 $b 는 메모리 위치상 같은 공간의 값을 가리키고 있게 됩니다.

그럼 엠퍼센트가 함수에 붙었을 경우는...

 

class test {

    private $a = 1;

    public function &aa() {

        echo $this->$a;

    }

}

 

$t = new test();

$d = &$t->aa();

echo $d; // 1 출력

 

$d++;

 

echo $t->aa(); // 2 출력

 

위 예제의 결과와 같이 $d 변수에 ++ 를 해주니 실제 객체 안에 있는 $a 멤버변수의 값이 변환되고 있습니다. 만약 위 예제에서 & 를 제외한다면 두번째 출력 값은 1 이 될 것 입니다.

 

그런데 주의하실 점은 위 예제와 같이 메소드를 통해 참조전달을 사용하시려면 메소드명 앞에도 엠퍼센트를 붙여줘야 한다는 것과 class 안에서 private 이나 protected 로 선언된 변수라도 위와 같이 사용을 하면 외부에서 접근이 가능하다는 것에 주의하셔야 합니다.

 

 

 

3. 클래스에서 ::이건 또 어디에 쓰이는지;;

가끔 보면 $test::test();이렇게 되어있던데 이건 어떻게 쓰고 왜 쓰는지 알려주세요

 

- :: 는 하나의 실행 연산자인데요. class 내에 메소드를 사용하려면 class 명을 이용하여 객체를 생성하고 해당 객체를 이용해서 메소드를 실행하게 됩니다. 하지만 가끔 어떤 class 내에 메쏘드 기능이 잠시 필요할 수도 있겠죠? 이런 상황에서 :: 를 쓰면 가장 좋습니다. 아래 예를 보세요.

 

class test {

    private $num = 1;

    public function aa() {

        echo "Hello!";

    }

    public function bb() {

        echo $this->num;

    }

}

 

우선 일반적인 방법으로 aa() 메소드를 실행하려면...

 

$t = new test();

$t->aa();

 

이렇게 해야 합니다. 하지만 :: 연산자를 사용하면 아래와 같이 한줄로 끝나죠.

 

test::aa();

 

여기서 중요한 것은 위와 같이 실행했을 경우 실제 test 객체는 생성되지 않습니다. 그 말은 $num 이란 멤버 변수 역시 생성되지 않는 다는 것이죠. 그래서 test::bb() 와 같이 bb() 메소드를 실행하면 에러가 출력됩니다. 이 점만 기억하시면 별문제 없이 사용하실 수 있겠네요.

 

 

 

4. static정적 멤버변수는 어디에 쓰이는지 궁금해요.

 

- 이 변수는 객체가 여러번 생성되도 모든 객체가 공유할 수 있는 값을 저장하는데 사용하시면 됩니다. 딱히 떠오르는 예제는 없지만 싱글턴 이라는 디자인패턴이 있습니다.

 

이 패턴의 중요 포인트는 어떤 프로그램에서 a라는 클래스를 여러번 이용할 경우 객체가 여러개 생성되게 됩니다. 이때 만약 처음으로 생성되는 객체를 프로그램 끝까지 사용할 수 있도록 하면 메모리 사용량도 줄일 수 있고 편리하겠다 하는 아이디어에서 나온 패턴입니다. 이 패턴을 구성할 때 사용되는 것이 static 변수 입니다.

 

class test {

    private static $instance = null;

 

    public static function getInstance() {

        if(self::$instance == null) {

            self::$instance = new self;

        }

        return self::$instance;

    }

 

    public function go() {

        echo 'Hello!';

    }

}

 

위 예제는 간단한 싱글턴 구조입니다. 이 클래스를 사용할 때는 이전의 new 키워드가 아닌 :: 연산자를 이용하여 getInstance() 를 바로 실행 함으로써 객체를 생성하게 됩니다.

 

$t = test::getInstance();

 

위와 같이 생성을 하게 되면 getInstance() 메소드 내용대로 현재 객체가 생성되어 있는지를 확인하고 생성되어 있지 않을 경우 새로 생성하여 반환하며 생성되어 있다면 해당 객체를 반환합니다. 즉 전체 프로그램에서 100번을 사용해도 실제 생성되는 객체는 1개라는 것이죠.

 

이와 같이 프로그램이 종료되기 직전까지 꾸준히 필요한 값을 저장하는 용도로 사용하기에는 딱 좋겠죠? 

반응형

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

PHP7 에서 PHP5.6 사용하기  (0) 2016.11.11
SQL Relay php connection  (0) 2016.07.17
PHP PHP EXCEL (PHP 엑셀 읽기 쓰기)  (0) 2016.01.21
ubuntu php에서 redis사용하기 - Predis  (0) 2015.05.28
PHP PDO 예제  (0) 2015.05.08

+ Recent posts