The Pursuit of Happyness

closure +1
반응형

모던 PHP 특징


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


- 네임스페이스

-- PHP 코드를 운영체제의 파일시스템 디렉터리 구조처럼 가상 계층 구조로 격리시켜준다.

-- 키워드 namespace, use


- 인터페이스

-- interface 를 정의하고 implements 해서 쓸 수 있다.


- 트레이트

-- 서로 상속관계로 묶기 애매하고 인터페이스로 공통 요소를 추상화 하기도 힘든 경우 사용

-- Trait을 사용할 클래스에 필요한 변수와 메써드를 정의하고, 각 클래스에서 use 키워드를 이용해서 trait 기능을 이용한다.

ex) 영화와 게임 클래스를 만든다고 하면, 둘 간에 상속관계도 없고, 추상화 할 요소도 없다. 각 클래스에 이름이라는 속성과 setName, getName 이라는 메써드만 공통적으로 사용된다면 아래와 같이 trait을 이용할 수 있다.


<?php

trait MediaMetaData 

{

    protected $mediaName;

    public function setMediaName($mediaName)

    {

        $this->mediaName = $mediaName;

    }

    public function getMediaName()

    {

        return $this->mediaName;

    }

} 


<?php

class Movie 

{

    use MediaMetaData;

} 


<?php

$movieTest = new Movie();

$movieTest->setMediaName("Test Movie");

echo $movieTest->getMediaName();


- 제네레이터

-- Iterator 와 달리 요구가 있을 때마다 반복적으로 값을 계산해서 돌려주는 기능

-- 계산 결과를 메모리에 모두 올릴 필요가 없어 매우 효율적인 운영이 가능


아래 예제에서 arrayOld 의 경우 $length 크기의 배열을 생성해서 전달

반면에 arrayGen의 경우 foreach에서 호출시 마다 다음 값만 생성해서 전달


<?php

function arrayOld($length)

{

        $ret = [];

        for ($i = 0;$i < $length; $i++)

        {

                $ret[$i] = $i;

        }

        return $ret;

}


function arrayGen($length)

{

        for ($i = 0;$i < $length; $i++)

                yield $i;

}


$len = 100000


foreach (arrayOld($len) as $i)

    echo $i . PHP_EOL;


foreach (arrayGen($len) as $i)

    echo $i . PHP_EOL; 




- 클로저

-- 생성 당시 자신의 주변 상태를 캡슐화한 함수 (함수 포인터라고 생각하면 된다.)


<?php

$closure = function ($name) {

        return sprintf("Hi %s", $name);

};


echo $closure("Tom") . PHP_EOL;




-  PHP 를 이용하여 http 서비스 테스트 하기

명령 프롬프트에서 다음과 같이 입력하면 8000 포트로 동작하는 http 서버를 띄울 수 있다. 한번에 하나의 요청씩만 처리하기 때문에 개발 테스트 용으로는 쓸수 있으나 Production 서비스 용으로는 적합하지 않다.


php -S localhost:8000


반응형