서버에 PHP operator 확장을 설치했다
서버에 PECL operator 확장을 설치했다. 이제 내 서버에서는 PHP로 연산자 재정의가 가능해졌다. 이것으로 PHP에서도 어느 정도 표현력 문제가 해결되었다. 아쉽게도 가장 중요한 호출 연산자—()—는 재정의가 불가능하다. PHP 5에서 기본적으로 제공하는 __call 오버로딩 기능과 겹쳐서인 듯하다.
PHP 다음 버전에서는 좀 더 동적이고 유연한 언어가 되기를 바란다. 아래는 원하는 기능 목록.
- 연산자 재정의(operator overloading)
- 클래스와 함수를 객체로
- 함수 리터럴 —
function(...) { ... } - 클로져 (static scope)
- 가변 인자(variable arguments)를 문법적으로 지원 —
function F(*$arguments) { ... }
- 함수 리터럴 —
- 자료형(type)과 클래스를 통합
- 배열 리터럴 —
[...] __call을 객체 자신의 호출 연산자 재정의용으로 수정즉, 현재 다음과 같이 작성한 코드는,
class T { function __call($name, $args) { return array('name' => $name, 'args' => $args); } }아래와 같이 작성해야 하게끔.
class F { function __construct($name) { $this->name = $name; } function __call(*$args) { return ['name' => $this->name, 'args' => $args]; } } class T { function __get($name) { return new F($name); } }또는—
class T { function __get($name) { return function(*$args) { return ['name' => $name, 'args' => $args]; } } }네임스페이스나 모듈의 제공 (물론 이것도 객체여야 한다!)
마지막으로, 달러 기호(
$)가 붙는 식별자와 그렇지 않은 식별자를 변수와 상수로 정하는 것이 좋을 듯하다. 즉, 클래스 이름이나 함수 이름은 상수에 바인딩된 객체가 되는 것이다. 반대로 아래와 같은 일도 일어날 수 있겠다.class $temporary_class { ... } function $temporary_functor { ... }

December 19th, 2006 at 11:35 PM
오호 재밌네요. 다음에 php로 쓸일 생기면 적극적으로 이용해볼게요.
December 20th, 2006 at 8:15 AM
테스트 보니까 솔깃한데?
March 1st, 2008 at 1:21 PM
[…] operator 확장을 설치한 경우에는 아래와 같이 제법 깔끔하게 사용할 수 있다. (S(0) 대신 $_0을 사용해도 된다.) […]