레이블이 객체지향인 게시물을 표시합니다. 모든 게시물 표시
레이블이 객체지향인 게시물을 표시합니다. 모든 게시물 표시

2007년 7월 24일 화요일

2. Objects in PHP

1. PHP5에 들어오면서 객체 지향적 설계가 가능하게 되었습니다.

2. PHP 클래스 형태
// 상속은 extends를 사용합니다.
class HelloWorld extends ParentClass{
       
private $world;
       
public $hello;
       
       
// 생성자입니다.
       
function __construct($world) {
               
// 자신의 프로퍼티나 메소드를 호출하는 경우 $this를 사용합니다.  
                $this
->world = $world;

               
// 부모의 생성자를 호출할 때는 parent를 사용할 수 있습니다.
                parent
::__construct();
       
}
       
       
function getHtml() {
               
return "Hello, ".$this->world."!";
       
}
}
3. PHP4와 달리 객체를 나타낼 때 레퍼런스를 사용합니다. PHP4에서 &를 사용하여 레퍼런스를 지정할 수 있어나 내부에서 symbol table alias를 가지고 있습니다.

4. 메소드의 Override를 지원합니다.

5. 기존에 exception이 발생하는 경우 die()를 사용하여 처리했습니다. PHP5에서는 throw를 사용하여 Exception을 발생시킬 수 있고,
throw new Exception('...');
try/catch를 사용하여 Exception을 잡을 수 있습니다.
try {
   ...
}catch(Exception $e) {
   print($e->getMessage());
}
6. 디버깅하는 경우 스택을 따라가고 싶을 때 debug_trace()와 debug_print_backtrace()를 사용할 수 있습니다.

7. 예외를 사용하는 것보다는 예외 상황에서 이를 처리하는 코드를 사용하는것이 더 좋습니다.

8. 사용자 정의 예외도 만들 수 있습니다. 그러나, 사용자 정의 예외는 최대 5~7개정도가 좋으며 내부에서 예외를 구분하는 코드를 사용하는 편이 더 낳습니다.
class UserException extends Exception{}
9. PHP에서 제공하는 예외를 사용자 정의로 바꾸는 것도 가능합니다.
class ErrorFromPHPException extends Exception{}
function PHPErrorHandler($errno, $errstr, $errfile, $errline) {
   throw new ErrorFromPHPException($errstr, $errno);
}
...
$oldhandler = set_error_handler('PHPErrorHandler');
fopen('/tmp/non-existent', 'r');
...
원상 복귀할 때도 set_error_handler를 사용하면 됩니다.
set_error_handler($oldhandler)
10. PHP에서 클래스를 생성하고 메소드를 호출할 때, 메소드가 없는 경우 __call()가 호출됩니다. (책에서는 오버로딩 시 사용합니다. 메소드 매개변수가 다른 경우 내부에서 __call()에서 적절한 메소드를 체크하여 호출시킵니다.)

11. __autoload() 정의되어 있지않은 클래스를 초기화하려는 경우 호출됩니다. (include되지 않은 클래스를 자동으로 호출하려고 하는 경우)


출처: Manning, PHP in Action(Objects, Design, Agility) 보면서 요약한 내용입니다.