2. PHP 클래스 형태
// 상속은 extends를 사용합니다.3. PHP4와 달리 객체를 나타낼 때 레퍼런스를 사용합니다. PHP4에서 &를 사용하여 레퍼런스를 지정할 수 있어나 내부에서 symbol table alias를 가지고 있습니다.
class HelloWorld extends ParentClass{
private $world;
public $hello;
// 생성자입니다.
function __construct($world) {
// 자신의 프로퍼티나 메소드를 호출하는 경우 $this를 사용합니다.
$this->world = $world;
// 부모의 생성자를 호출할 때는 parent를 사용할 수 있습니다.
parent::__construct();
}
function getHtml() {
return "Hello, ".$this->world."!";
}
}
4. 메소드의 Override를 지원합니다.
5. 기존에 exception이 발생하는 경우 die()를 사용하여 처리했습니다. PHP5에서는 throw를 사용하여 Exception을 발생시킬 수 있고,
throw new Exception('...');try/catch를 사용하여 Exception을 잡을 수 있습니다.
try {6. 디버깅하는 경우 스택을 따라가고 싶을 때 debug_trace()와 debug_print_backtrace()를 사용할 수 있습니다.
...
}catch(Exception $e) {
print($e->getMessage());
}
7. 예외를 사용하는 것보다는 예외 상황에서 이를 처리하는 코드를 사용하는것이 더 좋습니다.
8. 사용자 정의 예외도 만들 수 있습니다. 그러나, 사용자 정의 예외는 최대 5~7개정도가 좋으며 내부에서 예외를 구분하는 코드를 사용하는 편이 더 낳습니다.
class UserException extends Exception{}9. PHP에서 제공하는 예외를 사용자 정의로 바꾸는 것도 가능합니다.
class ErrorFromPHPException extends Exception{}원상 복귀할 때도 set_error_handler를 사용하면 됩니다.
function PHPErrorHandler($errno, $errstr, $errfile, $errline) {
throw new ErrorFromPHPException($errstr, $errno);
}
...
$oldhandler = set_error_handler('PHPErrorHandler');
fopen('/tmp/non-existent', 'r');
...
set_error_handler($oldhandler)10. PHP에서 클래스를 생성하고 메소드를 호출할 때, 메소드가 없는 경우 __call()가 호출됩니다. (책에서는 오버로딩 시 사용합니다. 메소드 매개변수가 다른 경우 내부에서 __call()에서 적절한 메소드를 체크하여 호출시킵니다.)
11. __autoload() 정의되어 있지않은 클래스를 초기화하려는 경우 호출됩니다. (include되지 않은 클래스를 자동으로 호출하려고 하는 경우)
출처: Manning, PHP in Action(Objects, Design, Agility) 보면서 요약한 내용입니다.