Laravel 이해 시작단계. Static 호출로 객체 사용하기.

HYEONG HWAN, MUN/ 11월 17, 2015/ 미분류/ 3 comments

https://blog.lael.be/post/2535

Laravel(라라벨) 이라는 프레임웍을 뜯어보고 있다.

대세 트랜드 코드를 보면 “이런 것도 되는구나” 라는 것을 느낀다.

 

프로그래밍 언어에 따라서 규칙이 약간씩 다른데, 불변의 진리라고 알고 있었던 것들이 바뀌는 것을 보면 혼란이 일어나곤 하더라.

PHP의 경우 선언 안한 메소드를 호출할 수 있고 (정적호출, 객체호출 등의 분기도 가능하다), 선언되지 않은 프로퍼티(속성값)에 값을 할당할 수 있는 등 신기한 것들이 되더라.

나중에 다룰 것인데 먼저 이론을 보고 싶은 사람은 PHP Magic Method 를 살펴보아라.

(http://php.net/manual/en/language.oop5.magic.php)

 

Laravel 의 주요 사용 방법인 Facade(파사드)에 대해 이해하려면 몇가지를 알아야 한다.

먼저 Facade 의 의미를 알아보도록 하자.

길고 장황하고 정확한 설명이 있겠지만 내가 의역하고 요약해서 Facade 를 설명하자면

static 함수 호출을 객체의 클래스(=서비스 라고 부르더라)와 연결시켜 주는 것

이다.

 


 

 

아무튼 Facade 이해의 첫번째 단계인 “static 호출로 객체를 사용하는 방법” 을 설명하고자 한다.

 

 

내 개념상의 static 메소드는 “함수꾸러미” 이었다. 그러니까 객체 자체와 상관없는 일을 할 경우 static 메소드로 정의하는 것이지.

JAVA나 JAVASCIRPT 에서 무심코 사용하는


Math.random();

이 그 예제이다. 산수 연산을 하는 Math 클래스의 random() static 메소드 이다. 객체를 선언 할 필요없는 일을 하므로 static 메소드로 선언하는 것이 올바른 것이지.

 

그런데! PHP의 경우 static 메소드 호출이 static 이라는 특수한 객체를 공유하더라.

static 이라는 객체를 재사용하기 때문에 값을 할당할 수도 있고, 객체 참조 같은 것이 되어 있다면 객체도 다룰 수 있다.

 

다음의 예시를 살펴보도록 하자.

 

1. 정적 메소드에서 정적 멤버변수 참조

static:: 으로 static 객체를 참조한다.

스크린샷 2015-11-25 오후 5.20.21

결과 :

스크린샷 2015-11-25 오후 5.23.07

 

2. 객체 메소드에서 객체 멤버변수 참조

이것은 C++ 이나 JAVA 처럼 상식적으로(?) 동작한다. 객체지향프로그래밍(Object Oriented Programming)에서 매우 당연한 동작이다.

스크린샷 2015-11-25 오후 5.25.56

 

결과 :

스크린샷 2015-11-25 오후 5.26.34

 

3. object 객체가 static 객체를 변경하고, 추후 static 호출에 영향을 주는 예제.

여기서부터 어려워질 것이다.

스크린샷 2015-11-25 오후 5.31.25

 

결과 :

스크린샷 2015-11-25 오후 5.33.55

 

 

4. object 객체가 static 객체를 변경하고, 추후 static 호출에 영향을 주는 - 다른 예제

3번의 예시가 조금 억지일 수도 있겠다 싶어서, 실제로 일어날 수 있는 다른 예제를 만들어 보았다.

스크린샷 2015-11-25 오후 5.37.48

결과 :

스크린샷 2015-11-25 오후 5.38.06

 

5. 정적 호출로 객체를 조작하는 예제

static 호출만으로도 객체를 조작할 수 있다. 꽤 놀랍지 않는가?

스크린샷 2015-11-25 오후 5.41.52

 

결과 :

스크린샷 2015-11-25 오후 5.42.54

 

6. PHP Magic Method 를 사용할 다음의 예제는 생략하도록 하겠다.

PHP의 __callStatic()  (http://php.net/manual/en/language.oop5.overloading.php#object.callstatic) 과 조합하면 단순복잡(?)한 동작을 만들 수 있다.

 


 

라엘이가 학습하면서 참조한 어떤 글에 다음과 같은 문구가 있더라. (2014년 10월에 쓰여진 글임.)

스크린샷 2015-11-25 오후 5.51.12

Static 메소드의 동작방법, Static 메소드로 Object 를 조작하는 방법, PHP Magic Method 등을 이해해서 fully experienced PHP programmer 에 가까워지도록 하자.

 


 

< 본문에서 사용한 예제소스를 첨부합니다 >

실제로 자신의 서버에서 실행시켜보면서 데이터의 흐름을 이해하도록 하자.

 


/**
* Lael static Class Example
*/
class SampleTest
{

    public $a = 'sample1';
    static $b = 'sample2';
    static $c = array();
    static $d;

    function print_a () {
        echo "Called : print_a()\n";
        echo $this->a;
        echo PHP_EOL;
        echo PHP_EOL;
    }


    static function print_b () {
        echo "Called : print_b()\n";
        echo static::$b;
        echo PHP_EOL;
        echo PHP_EOL;
    }

    function set_b() {
        static::$b = 'newnew3';
    }

    function set_c() {
        static::$c[] = rand(1, 10);
    }

    static function set_d() {
        static::$d = new App();
    }

}


class App
{
    private $name = 'demoApp';

    function show_name() {
        echo $this->name;
        echo PHP_EOL;
    }
}

if (true) {
    SampleTest::print_b ();
}

if (false) {
    $sampleObj = new SampleTest();
    $sampleObj->print_a();
}

if (false) {
    $sampleObj = new SampleTest();
    $sampleObj->set_b();
    SampleTest::print_b ();
}

if (false) {
    $sampleObj = new SampleTest();
    $sampleObj->set_c();
    $sampleObj->set_c();
    $sampleObj->set_c();
    $sampleObj->set_c();

    print_r(SampleTest::$c);
}

if (false) {
    SampleTest::set_d();

    // 이것에 대해 반드시 이해하세요.
    SampleTest::$d->show_name();
}



 

3 Comments

  1. 저..랜섬웨어에 감염됬는데 어떡하죠ㅠ

    1. 안타깝네요.
      랜섬웨어 종류가 많기 때문에 복구방법도 다양합니다.
      복구 과정도 꽤나 어렵습니다.

  2. 안녕하세요 php 독학중인 한 청년입니다.
    Modern php와 라라벨 국내자료가 많이 없어 찾아보기 어려워 보통 외국사이트 돌아다니는데요 php 정적메소드 관련 검색하던 도중 여기 들어왔는데 포스트가 이해도 잘되고 너무 정리가 잘되어있어요!!
    막막했었는데 정말 도움이 되었습니다. 앞으로도 php나 라라벨 관련자료 많이 포스팅해주세요~~ 큰 힘이 됐어요 감사합니다^^~

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*