역자 - 김영진(cogolda@hanmail.net)

이 문서는 http://www.zend.com/php5/andi-book-excerpt.php/ 의 내용을 제가 번역, 수정한 내용입니다. 질문이나 의견 있으신 분은 이메일이나 코멘트를 이용해 주시면 감사하겠습니다. 부분적으로 귀찮아서 생략한 부분도 있는데, 꾸준히 보강하겠습니다. 이 문서는 php5에 관심있는 모든 프로그래머를 위해 씌여졌습니다.

목차

  1. 소개
  2. 언어 특징
    • 새로운 객체지향 모델
    • 새로운 객제지향 특징
    • 다른 새로운 언어 특징
  3. 일반적인 언어 변화
    • XML과 웹 서비스
    • 새로운 MySQLi(MySQL) 확장
    • SQLite 확장
    • Tidy 확장
    • Perl 확장
    • PHP 5에서 다른 새로운 부분
  4. 요약

미래를 준비하는 가장 좋은 방법은 미래와 직면하는 것이다.(존 스컬리)

1. 소개

만약 PHP 5가 이전 버전(php 3, php 4)처럼 성공할 것인지는 시간이 말해 줄 것이다. 모든 단점의 PHP를 제거하기 위한 목적 바뀐 새로운 특징과 변화는 전세계에서 최고의 웹 스크립트 언어로서 선도적인 위치를 지킬 것이다. 이 책은(이 문서는 PHP 5 Power Programming라는 책의 2장입니다) PHP 5를 다루고 있고, 자세하게 새로운 특징도 있다. 그렇지만, PHP 4에 익숙한 사람들을 위해 PHP 5에서 새로운 점을 알고 싶은 사람을 위해 이 장을 썼다.

2. 언어 특징

새로운 객체 지향 모델
지브 사라스키(Zeev Suraski, 일본인?)가 PHP 3시절에 객체 지향 문법을 추가했을 때, 그것은 객체에 접근하기 위한 문법적인 설탕처럼 추가했다. 객체지향 모델은 상속을 지원했고 메소드와 속성을 둘 다 합치기 위해 클래스를 만들었다. 그러나 그 이상은 아니었다. 지브와 앤디가 php 4를 위한 스크립트 엔진을 다시 작성할 때, 그것은 완전히 새로운 엔진이었고, 보다 빠르게 돌아갔고, 보다 많은 특징에 적합했다. 그렇지만 객체지향 모델은 PHP 3에서 처음 도입되었고, 미숙한 부분이 있었다.

비록 객체 모델이 심각한 한계가 있었지만 그것이 큰 규모의 PHP 어플리케이션으로 전세계에서 확산되어 사용되었다. 그것이 단점에도 불구하고 PHP 4로 OOP 패러다임의 인상적인 사용은 PHP 5 버전을 위한 주요 관심이 되었다.

PHP 3 & 4의 한계가 무엇인가? 가장 큰 단점은 객체의 복사 의미가 네이티브 타임을 위한것과 같다는 사실이다. PHP 개발자에게 어떠한 영향을 미쳤는가? 우리가 변수를 (객체에 대한 참조) 다른 변수에 할당할 때, 객체의 복사는 생성된다. 이것은 강한 성능 뿐만 아니라 php4 어플리케이션에서 버그를 유발한다. 왜냐하면 많은 개발자는 변수

예를 들면

class Person {
var $name;
function getName() {
return $this->name;
}
function setName($name) {
$this->name = $name;
}
function Person($name) {
$this->setName($name);
}
}

function changeName($person, $name) {
$person->setName($name);
}

$person = new Person("Andi");
changeName($person, "Stig");
print $person->getName();

php4에서 이런 코드는 “Andi”를 출력한다. 이 이유는 우리가 변수로 changeName() 함수에 객체 $person을 넘기고, 그래서, $person은 복사되고 changeName()은 $person의 복사에서 작업한다. 이런 동작은 자바 같은 동작을 기대했던 많은 개발자에게는 직관적이지 않다. 자바에서 변수는 정확이 핸들(또는 포인터)을 객체에 붙들고 있다. 그러므로 그것은 단지 핸들만 복사될 뿐 전체 객체는 복제되지 않는다.

PHP 4에서 사용자는 두가지 부류가 있다, 이런 문제를 인식하는 개발자와 인식하는 개발자이다.

구형 객체 모델은 위에 말한 문제를 유발할 뿐만 아니라 존재하는 객체 모델의 상위에 추가적인 특징을 구현하는데 방해되는 기본적인 문제를 유발하기도 한다.

PHP 5에서, 객체 모델의 기반은 객체 핸들로 다시 작성되었고, 여러분이 clone 키워드를 사용하여 객체의 클론을 명시하지 않는 한, 여러분은 여러분의 객체의 내부에서 절대 만들 지 않는다. PHP5에서 참조로 객체를 넘기는 것이 필요하지 않고 참조로 그것은 할당하지도 않는다.

알아두기:참조로 넘기는 것과 참조로 할당하는 것은 여전히 지원한다. 이경우에 여러분은 변수의 내용을(객체나 다른 타입) 정확히 바꾸기를 원한다.

새로운 객체 지향 특징
새로운 객체지향 특징은 이 절에서 상세히 설명하기에 너무 방대하다. 객체지향 언어 챕터에서 자세히 나와있다.주로 새로운 특징 목록은 밑에 나열해 놓았다.

1. 메소드와 속성을 위한 public/private/protected 접근 수정자

일반적인 OO 접근 수정자의 사용은 메소드나 속성에 접근을 제어하게 해준다.

class MyClass {
private $id;

public function getId() {
return $this->id;
}
}

2. 유일(unified) 생성자 이름 __construct()

클래스의 이름이 되는 생성자 대신에, 이제는 __construct()로 선언 된다. 클래스 계층 안에서 클래서의 이동을 쉽게 만든다.

class MyClass {
function __construct() {
print "생성자 내부";
}
}

3. __destructor() 메소드를 정의함으로서, 객체 소멸자를 지원한다.

객체가 파괴될 때, 실행되던 소멸 함수를 정의가 허락한다.

<?
class MyClass {
function __destruct() {
print "객체 파괴";
}
}
?>

4. 인터페이스

is-a 관계 보다 완전하게 하기 위한 클래스를 위한 능력을 준다. 클래스는 한 클래스로부터 상속받을 수 있으나 그것이 원하는 것처럼 많은 인터페이스처럼 구현하지는 않는다.

interface Display {
function display();
}

class Circle implements Display {
function display() {
print "Displaying circle";
}
}

5. instanceof 연산자

is-a 관계 확인을 위해 언어 수준의 지원. Php4의 is_a() 함수는 지금 비난받는다.

if ($obj instance of Circle) {
print '$obj 은 Circle';
}

6. final 메소드

final 메소드 키워드는 여러분이 상속하는 클래스가 그것을 오버로드 할수 없는 것을 표시하는 메소드이다.

class MyClass {
final function getBaseClassName() {
return __CLASS__;
}
}

7. final 클래스

final로서 클래스를 선언하고, 그것은 상속할 수 없다. 다음과 같은 예제는 에러를 내보인다.

final class FinalClass {
}

class BogusClass extends FinalClass {
}

8. 명시 객체 복제(cloning)

객체를 복제하기 위해, 여러분들은 clone 키워드를 사용해야 한다. 여러분은 아마 복제 처하는 동안 호출될 __clone() 메소드를 선언했을 것이다.

class MyClass {
function __clone() {
print "Object is being cloned";
}
}
$obj = new MyClass(); // 이것은 인스턴스를 만들고
clone $obj;// 이것은 객체를 복제함

9. 클래스 상수

클래스 정의는 상수를 포함 할 수있고, 클래스를 이용하여 참조된다

class MyClass {
const SUCCESS = "Success";
const FAILURE = "Failure";
}
print MyClass::SUCCESS;

10. 정적 멤버

클래스 정의는 이제 클래스를 통해 접근 가능한 정적 멤버(속성)를 포함 할 수있다. 정적 멤버의 일반적인 사용은 독자 패턴에서 이다.

class Singleton {
static $instance = NULL;
function getInstance() {
if ($this->instance == NULL) {
$this->instance = new Singleton();
}
return $this->instance;
}
}

11. 정적 메소드

여러분은 이제 비객체 문맥으로부터 호출되는 것 허락하게하는 정적으로 메소드를 정의할 수 있다. 정적 메소드는 그들이 모든 특정 객체에 묶이지 않고 $this 변수를 정의 하지 않는다.

<?
class MyClass {
static function helloWorld() {
print "Hello, world";
}
}
MyClass::helloWorld();
?>

12. 추상 클래스

클래스는 인스턴스되는것으로부터 그것을 방해하기 위해 추상으로 선언될 수 있다. 그렇지만, 여러분들은 추상 클래스로부터 상속할 수 있다.

abstract class MyBaseClass {
function display() {
print "Default display routine being called";
}
}

13. 추상 메소드

메소드가 추상으로 선언되고, 그 때문에 상속하는 클래스에 그 정의를 양보한다. 추상메소드를 포함하는 클래스는 추상으로 선언된다.

abstract class MyBaseClass {
abstract function display();
}

14. 클래스 타입 힌트

함수 선언은 파라미터를 위해 클래스 타입 힌트를 포함하기도 한다. 만약 함수가 부적절한 클래스 타입으로 호출되면, 에러가 발생한다.

function expectsMyClass(MyClass $obj) {

}

15. 메소드에서 리턴되는 역참조(defrferencing)를 지원한다.

PHP 4, 여러분은 메소드로부터 반환되는 객체를 반참조할수 없었다. 여러분은 더미(dummy 변수에 첫 객체를 할당해야하고, 그것을 역참조 한다.

PHP 4:

$dummy = $obj->method();
$dummy->method2();

PHP 5:

$obj->method()->method2();

16. 반복자(Iterators)

php5는 php 클래스와 php 확장 클래스 둘 다 반복자 인터페이스을 구현하게 해준다. 여러분은 여러분이 foreach() 언어 생성자를 사용으로 클래스의 인스턴스를 반복할수 있을 인터페이스를 구현한다.

$obj = new MyIteratorImplementation();
foreach ($obj as $value) {
print "$value";
}

function __autoload($class_name) {
include_once($class_name . "php");
}

$obj = new MyClass1();
$obj2 = new MyClass2();

이상 새롭게 강화된 객체지원에 관해 나열했는데, 쉽게 애기하면, 자바만큼 객체를 지원한다. 대략 이런 애기입니다.

다른 새로운 언어 특징
1. 예외 핸들링

PHP 5에서 잘 알고있는 try/throw/catch/ 구조적 예외 처리 개념을 추가했다. 여러분은 Exception 클래스에서 상속한 객체를 던지게(throw) 만들 수 있다. (자바 써 보신 분은 대단히 반가워 할 내용입니다. 이제 if문을 줄이자!)

class SQLException extends Exception {
public $problem;
function __construct($problem) {
$this->problem = $problem;
}
}

try {
...
throw new SQLException("Couldn’t connect to database");
...
} catch (SQLException $e) {
print "Caught an SQLException with problem $obj->problem";
} catch (Exception $e) {
print "Caught unrecognized exception";
}

현재, 이전버전과 호환성 목적을 위해, 대부분의 내부 함수는 예외로 던질 수 없다. 이미 존재하는 set_error_handler()과 비슷하게, 여러분은 스크립트 종료전에 처리할 수 없는 예외를 잡기위해 set_exception_handler()를 사용한다.

2. 참조를 이용한 foreach

php4에서 여러분은 그 배열을 통해 반복하거나 그 변수를 수정할수 없었다. Php5는 ‘&’(reperence) 표시로 foreach() 반복문을 표시함으로서 지원한다.

foreach ($array as &$value) {
if ($value === "NULL") {
$value = NULL;
}
}

3. 참조 인자를 위한 디폴트 변수

php4에서 디폴트 변수는 변수로 넘겨지는 파라미터만 주어졌다. 참조 파라미터로 넘지겨지는 디폴트 변수를 주는 것은 지금 지원된다.

function my_func(&$arg = null) {
if ($arg === NULL) {
print '$arg is empty';
}
}
my_func();

3.일반적인 PHP 변화

XML과 웹 서비스
언어에서 다음과 같은 변화로는, php5에서 XML 업데이트는 아마도 중요하고 멋진것이다. Php5에서, 강화된 XML 기능은 다른 언어와 비교해서 동등하거나 따라잡았다.

기반
php4에서 xml지원은 다양한 바탕 XML 라이브러리를 사용하여 구현되었다. SAX 지원은 오래된 Expat 라이브러리를 사용하여 구현 되었고, XSLT는 Sablotron 라이브러리를 사용하여 구현되었고, DOM은 그놈(GNOME) 프로젝트에 의해 보다 강력한 libxml2 라이브러리를 사용하여 구현되었다. 다양한 라이브러리의 사용은 그것이 xml 지원할때 php4를 뛰어나게 만들지 못했다. 관리가 어설펐다(poor). 새로운 XML 표준은 항상 지원되지 않았고, 성능은 그것을 가졌을 때 만큼 좋진 않았고, 다양한 XML 확장 사이에 상호운영성은 존재하지 않았다.

Php 5에서 모든 XML 확장은 suberb libxml2 XML toolkit(http://www.xmlsoft.org)을 사용하여 재작성되었다. 그것은 관리하기 좋고 XML 기술을 php로 가져오는 XML 표준의 효과적인 구현하는 매우 다양한 특징이 있다.
이상 언급한 확장(SAX, DOM 그리고 XSMT)는 지금 새로운 추가 확장 SimpleXML과 SOAP을 포함하는 libxml2를 사용한다.

SimpleXML
아마도 1-2년 전으로 뒤돌아 보면, SimpleXML이 XML 파일로 작업하는 php 개발자에게 혁명임이 명확하다. SimpleXML은 정말 바보(dummies)를 위한 XML로 불려졌다. DOM과 SAX로 처리하는 대신에, SimpleXML은 PHP 객체로서 XML 파일을 보여준다. 여러분은 쉽게 접근하는 요소(elements)와 속성(attributes)를 읽고 작성하거나 반복할 수 있다.

다음 XML 파일을 보자

<clients>
<client>
<name>John Doe</name>
<account_number>87234838</account_number>
</client>
<client>
<name>Janet Smith</name>
<account_number>72384329</account_number>
</client>
</clients>

다음의 코드는 클라이언트 이름과 계좌번호를 출력한다.

$clients = simplexml_load_file('clients.xml');
foreach ($clients->client as $client) {
print "$client->name has account number $client->account_number ";
}
SimpleXML이 얼마나 간결한지 명백하다.
SOAP
Php4의 공식적인 SOAP지원은 부족했었다. 대부분 일반적이로 사용되는 SOAP 구현은 PEAR이다 그러나 그것은 php에서 전체적으로 구현되었으나, C 확장과 마찬가지로 수행할 수 없었다. 다른 이용 가능한 C 확장은 안정적이지도 널리 채택되지도 않았다. 그러므로 php 5 배포판에 포함되지 않았다.

Php5에서 SOAP 지원은 C 확장으로서 완벽하게 재작성되었고, 비록 그것이 늦은 단계에 완성되었지만, 그것은 표준의 대부분의 구현 때문에, 디폴트 배포판에 협력된다.

다음은 WSDL 파일에서 정의 된 SomeFuncion()을 호출한다

$client = new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);
New MySQLi(MySQL Improved) 확장
Php5를 위해, MySQL AB (http://www.mysql.com)은 MySQL 4.1과 그 이상버전에서, 새로운 기능의 포든 장점을 취하는 새로운 MySQL 확장을 작성했다. 구형 MySQL 확장에 반하여, 새로운 것은 여러분에게 함수형, 객체지향 인터페이스 둘다 사용할 수 있고, 그래서 여러분은 여러분이 좋아하는 것을 선택할 수 있다. 이 확장으로 지원되는 새로운 특징은 다음과 같다.
미리 준비된 문장(Prepared statements), 가변 결속(variable binding), SSL과 압축된 커넥션, 트랜젝션 제어, 복제(replication)…

SQLite 확장
SQLite(http://www.sqlite.org)의 지원은 php 4.3.x에서 처음 도입되었다. 그것은 SQL 서버를 요구하지 않는 내장형 SQL 라이브러리이고 SQL 서버의 규모를 요구하지 않는 어플리케이션에 매우 적합하다. 또는 만약 여러분이 ISP에서 SQL 서버에 접근할 수 없는 경우에도 적합하다. SQLite라는 이름과는 다르게 그것은 매우 다양한 특징과 트랜젝션, sub-select, view 그리고 대규모 DB file을 지원한다. 그것은 php 5버전으로서 언급되었다.
왜냐하면 그것은 php4의 뒤늦게 도입되었고, 객체지향 인터페이스와 반복자를 지원을 제공되면서 php 5의 장점을 취했기 때문이다.

Tidy 확장
Php 5는 유용한 Tidy (http://tidy.sf.net/) 라이브러리를 포함한다 그것은 php 개발자가 HTML 문서를 구문분석, 분류, 청소, 복구하도록 도와준다. Tidy 확장은 함수, 객체지향 인터페이스를 지원하고 그것의 API는 php 5 예외 메커니즘을 사용한다.
펄 확장
기본 php5 패키지에서 포함되지는 않지만, 펄 확장은 여러분이 펄 스크립트를 호출하는 것을 가능하게 한다. 펄 객체를 사용하고 다른 펄 기능을 php에서 사용할 수 있다. 이런 새로운 확장은 PECL (PHP Extension Community Library) 저장소(repository) http://pecl.php.net/package/perl 에 있다. (php가 펄객체를 사용할 수 있다고 합니다)
Php5에서 다른 새로운 것들
새로운 메모리 메니저
젠드 엔진은 새로운 메모리 관리자를 가지고 있다. 두 주요 장점은 멀티 쓰레드 환경을 위한 지원과 각 요청 후에 할당된 메모리 블록은 보다 효율적이다.

윈도우 95 지원의 취소
윈도우 95 플랫폼상에 운영되는 php는 더 이상 지원되지 않는다. 왜냐하면 MS사가 윈도우 95를 공식적으로 지원하지 않을 거라고 했기 떄문에, php 개발 공동체도 그렇게 하기로 결정했다.

4. 요약

여러분은 php5에서 많은 발전이 인상적일것이다. 위에 언급했듯이, 이 챕터는 모든 발전을 다 다루지는 않는다. 다른 추가적인 발전은 많은 버그가 수정되었고 대단히 발전했다는 것이다.
, .