1. 2007.11.05 PHP5 새로운 함수
  2. 2007.11.02 PHP5에서의 객체지향프로그래밍

PHP5 새로운 함수

PHP 5에서 새로운 함수가 추가되었습니다. 그 목록입니다:

배열:

  • array_combine() - 하나의 배열을 키로, 하나의 배열을 값으로 가지는 배열을 생성합니다.

  • array_diff_uassoc() - 사용자가 제공하는 콜백 함수를 통한 추가적인 인덱스 확인을 포함하여 배열의 차이를 계산합니다.

  • array_udiff() - 데이터 비교에 콜백 함수를 사용하여 배열의 차이를 계산합니다.

  • array_udiff_assoc() - 추가적인 인덱스 확인을 통한 배열의 차이를 계산합니다. 데이터 비교는 콜백 함수를 사용합니다.

  • array_udiff_uassoc() - 추가적인 인덱스 확인을 통한 배열의 차이를 계산합니다. 데이터 비교는 콜백 함수를 사용합니다. 인덱스 확인도 콜백 함수를 사용합니다.

  • array_walk_recursive() - 배열의 모든 원소에 사용자 함수를 적용합니다.

인터베이스:

iconv:

스트림:

기타:

참고: Tidy 확장도 API가 완전히 바뀌었습니다.

출처:[http://kr2.php.net/manual/kr/migration5.functions.php]

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

정규식  (0) 2007.11.22
PHP5에서의 객체지향프로그래밍  (0) 2007.11.02
유용한 일반 함수 모음  (0) 2007.10.24

PHP5에서의 객체지향프로그래밍

PHP4에서는 문법적으로만 객체지향프로그래밍 지원했다고 한다면 PHP5에서는 개념적, 구조적으로 객체지향적 프로그래밍을 지원하게 되었다.

-

1. 멤버접근 제한자

접근제한자 의미
private 해당 클래스 내에서만 접근 가능
protected 해당 클래스 및 자식클래스에서만 접근가능
public 모든 클래스에서 접근 가능

2. This 참조

클래스 정의 후 인스턴스를 생성한다.

이때 생성된 인스턴스의 멤버변수나 함수를 지칭하거나 호출할 때마다 클래스이름을 이용하여 호출할 경우 프로그램의 변환가능성이나 사용성이 현저히 떨어질 것이다.

이때 사용하는 것이 범용성이 높은 This참조이다.


public function setTime($hour, $minute, $second) {
    $this->hour = $hour;
    $Time->minute = $minute;
    ...

3. 인스턴스 생성,소멸, 입력값 체크


인스턴스 생성과 소멸 시 초기값 입력이나 입력값 체크를 하려할 경우가 많을 것이다. 이때마다 초기값 입력이나 입력값 체크를 하는 함수를 만든다면 비효율적일 것이다. 이때 생성

class Time {
	private $hour;
	private $minute;
	private $second;

	// 인스턴스 생성 시 무조건 자동호출되는 메소드
	// 초기값 자동세팅 기능으로도 활용할 수 있음
	function __construct($hour, $minute, $second) {
		$this->setTime($hour, $minute, $second);
	}

	function __distruct() {
		echo "소멸자 호출!\n";
	}

	public function setTime($hour, $minute, $second) {
		$this->hour = $hour;
		$this->minute = $minute;
		$this->second = $second;
	}

	/*
	// 객체인스턴스 메소드 입력값 체크해주는 로직
	public function setTime($hour, $minute, $second) {
		$this->hour = ($hour >= 0 && $hour < 24) ? $hour : 0;
		$this->minute = ($minute >= 0 && $minute < 60) ? $minute : 0;
		$this->second = ($second >= 0 && $second < 10) ? $second : 0;
	}
	*/

	public function ToUniversalTime() {
		return sprintf("%02d:%02d:%02d", $this->hour, $this->minute, $this->second);
	}
}

$time = new Time(22, 57, 38); // 초기값을 인스턴스 생성 요청 

// $time = NULL; //요렇게 NULL값입력하면 객체강제소멸되며 아래 객체참조부분 에러발생
echo $time->ToUniversalTime();

4. __set(), __get() 메소드


클래스 정의 시 정의된 멤버변수외에 다른 멤버에 값을 할당하거나 참조할 때 자동으로 호출되는 메소드.

캡슐화에 활용되므로 ..  객체지향적 프로그래밍을 지원하는데 중요한 메소드임.

class Time {
	private $data;

	// 최초 인스턴스 생성 시 setTime 메소드 호출
	function __construct($hour, $minute, $second) {
		$this->setTime($hour,$minute,$second);
	}

	// 정의되지 않은 멤버값을 참조할 때 호출. 배열변수 data 값 참조
	function __get($name) {
		return isset($this->data[$name]) ? this->data[$name] : NULL;
	} 

	// 정의되지 않은 멤버값 할당할 때 호출.
	function __set($name, $value) {
		//인자'name', 'value'가 배열변수라면
		if (in_array($name, array('hour', 'minute', 'second'))) {
			if (!strcmp($name, 'hour'))
				$value = ($value >= 0 && $value < 24) ? $value : 0;
			else
				$value = ($value >=0 && $value <60) ? $value : 0;
			$this->data[$name] = $value;
		}
	}

	// 정의되지 않은 멤버값 호출
	public function setTime($hour, $minute, $second) {
		// __set 메소드 호출
		$this->hour = $hour;
		$this->minute = $minute;
		$this->second = $second;
	}

	public function ToUniversalTime() {
		return sprintf("%02d:%02d:%02d", $this->hour, $this->minute, $this->second);
	}

	public function ToStandardTime() {
		return sprintf("%02d:%02d:%02d%s", (($this->hour % 12 == 00) ? 12 : $this->hour % 12), $this->minute, $this->second, ($this->hour < 12? 'AM' : 'PM'));
	}
}

// __construct 메소드 호출
$time = new Time(22, 57, 38);

echo $time->ToUniversalTime();
echo $time->ToStandardTime();

5. __toString() 메소드

 

인스턴스의 현재 상태나 모습을 그대로 나타내야 할 경우가 있다.
이때 문자열 형태로 인스턴스의 상태나 모습을 그대로 출력해 주는 예약된 메소드가 __toString() 메소드이다.
(자바나 C#의 toString() 메소드와 같은 역할 수행)

메소드의 실제기능은 사용자가 재정의하나 호출은 사용자가 해당 클래스의 인스턴스를 echo, print()과 같은 문자열 출력 메소드를 이용하여 출력하려고 하면 자동으로 호출진다.


[샘플]

class Time {

	...

	function __toString() {
		return 'Time :'.$this->ToUniversalTime();
	}

	...

}
// 인스턴스 생성
$time = new Time(22, 33, 44);
// Time : 22:33:44 출력
echo $time;
// 위와 동일결과 출력
echo new Time(13, 23, 43);
// 인스턴스 생성되었으나 
// '.' 연산자 기능먼저수행
// '결과 => Object id#1' 출력
echo '결과 =>'.$time;
// 연결연산기능과 문자열표현을 다 이용하려면
// ',' 연산자 사용
// '결과 => Time : 13:23:43' 출력됨
echo '결과 =>'.$time;
// 'Object id#1' 출력
echo (string)$time;

6. Type hinting


PHP에서는 Java나 C#에서처럼 명시적인 타입정의를 통해 타입제약을 엄격하게 적용하고 있지 않다.
그러나, PHP에서도 함수나 메소드를 정의할 때 인자가 클래스의 인스턴스를 변수형으로 가질 경우 해당 인자앞에 변수형인 인스턴스의 클래스 이름을 명시할 수 있다.
이렇게 인자의 타입을 정의하면 타입이 정의한 클래스로 한정된다.


Type hinting기능을 사용 하지 않을 경우 일일이 해당 인자값을 검사하는 루틴을 중간에 삽입해야 함.


[샘플]


class Date {
    private $year;
    private $month;
    private $day;

    function __construct($year, $month, $day) {
        if(checkdate($month, $day, $year)) {
            $this->year = $year;
            $this->month = $month;
            $this->day = $day;
        } else {
            die ('wrong date data');
        }   
    }   

    function toUniversalDate() {
        return sprintf("%04d/%02d/%02d", $this->year, $this->month, $this->day);
    }   
}

class Employee {
    private $firstName;
    private $lastName;
    private $birthDate;

    function __construct($firstName, $lastName, Date $birthDate) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->birthDate = $birthDate;
    }   

    public function getBirthDate() {
        return $this->birthDate;
    }   

    public function __toString() {
        return 'Employee:'.$this->lastName.$this->firstName.'['.$this->birthDate->toUniversalDate().']';
    }   

};

$employee = new Employee('Gil', 'Gong', new Date(1990, 01, 21)); 
$employee = new Employee('Gil', 'Gong', '1990/01/21'); // __construct 함수에 Date 클래스형태로 인자값 지정
// 에러 발생함
//Fatal error: Argument 3 passed to Employee
echo $employee."\n";
echo $employee->getBirthDate()->toUniversalDate(); // PHP5에서 본격적으로 지원되는 객체에서 또 다른 객체 참조

7. 정적 클래스 멤버


하나의 객체에서 생성된 인스턴스가 공통적으로 영향을 미쳐야 하는 한 멤버변수가 있을 경우 이를 정적 클래스 멤버변수로 정의해서 사용한다.

예를 들어 인스턴스 Book01, Book02 를 가진 Book 클래스의 총출판권수 정보가 필요할 경우 이를 클래스 수준에서 다루어 정적 클래스 멤버변수로 정의한다.


"클래스이름 ::"의 형태로 접근한다.


[샘플]

class Book {
	public static $count = 0;
	private $title;

	...

	function __construct($title, $price) {
		++Book::$count;
		...
	}
}

...

$book1 = new Book('War  wolf', '10000');
echo '클래스 생성 후 책 수량 :'.Book::$count;

...

정적 클래스 멤버함수도 동일하게 사용된다.



8. 클래스 상속


- 파일참조를 통한 클래스 참조

if (!class_exists('Book')) {
	include_once 'class.book.php';
}

...

- 클래스 상속

class Magazine extends Book {

...

}

이때 부모클래스의 Private 멤버변수는 하위클래스에서도 접근할 수 없으므로 종종 원치않는 결과가 나온다. 이때는 Protected 접근권한으로 부모클래스 멤버변수를 정의한다.


9. 의미는 있지만 직접적 구현이 필요치 않은 중간매체적 클래스, 추상클래스 (abstract class)

 

추상클래스로 부터 바로 인스턴스를 생성할 수는 없으며, 반드시 추상클래스를 상속받은 구체클래스(Concrete class)로 부터 인스턴스를 생성해야 한다.


이때, 모든 메소드가 추상메소드로만 정의된 클래스를 인터페이스(interface)라고 한다.

interface Shape {
	public abstract function getArea();
	public abstract function getVolume();
}
...

class Point implements Shape {
	...
}

인터페이스를 통한 다중상속의 효과


class D extends C implements A, B {
	...
} 

10. 아주 유용한.. ^^ 클래스 파일을 자동으로 찾아서 로딩해줄 수 있는 __autoload() 메소드

function __autoload($class) {
	// 단, 클래스를 'class.data.php' 와 같이
	// 미리 파일로 분리해 두어야 함
	require_once 'class.'.$class.'php';
}

// Magazine 클래스가 없으므로 __autoload() 메소드를 호출 
echo new Magazine(22);
echo new Book(22);
echo new Books(22);
echo new Article(23);

cf. 실수로 클래스에서 정의되지 않은 메소드를 호출하였을 경우 어떤 메소드가 미리 정의되지 않았는가 볼려면 __call() 메소드를 이용하면 된다.

__call ($method, $parameter) {
	...
}

의 형태로 자동호출하면 된다.



■■■■■ 예외처리 (Exception Handling) ■■■■■■



1. try / catch / throw


try {
	//예외가 발생할 수 있는 코드
	throw new Exception ('예외가 발생하였습니다!');
} catch (Exception $exception) {
	// 예외가 발생했을 때의 에러처리 코드 
	echo '발생사유 : '.$exception->getMessage().'(Error Code :'.$exception->getCode().')';
	echo '발생위치 : '.$exception->getLine().'라인'.$exception->getFile().'파일';
}

위 내용은 PHP5에서 제공하는 기본예외클래스인 Exception 클래스를 사용한 예이며, 개발자가 직접 예외클래스를 만들 수도 있다.

class FileIOException extends Exception {
	function __construc($message) {
		$this->message = $message;
	}
}

try {
	if (!$fp = @fopen('unknown.txt', 'r'))
		throw new FileIOException('지정하신 파일을 찾을 수 없습니다.');
} catch (FileIOException $exception) {
	echo $exception->getMessage();
	echo $exception->getCode();
	echo $exception->getFile();
	echo $exception->getLine();
	echo $exception->getTraceAsString;
}


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

PHP5 새로운 함수  (0) 2007.11.05
유용한 일반 함수 모음  (0) 2007.10.24
랜덤 숫자 + 영문  (1) 2007.10.05
Return top