前回SplTypeを使って厳密なSplInt型を作りました。
が、用意されているのはint、stringといったスカラー型だけでした。
自作のクラスに対応するためにSplTypeが用意されています。
SplTypeはabstractなクラスです。
何故インターフェイスじゃないんだ。
<?php
class HOGE extends SplType{}
$hoge = new HOGE();
$hoge = 1; // Uncaught exception 'UnexpectedValueException'
あれ、これ全クラスをextends SplTypeってしとけば強い型付け言語PHPの誕生じゃね?
PHPは型付けが~とか言ってる人はいっぱいいるけど、これを紹介してる人がただの一人もいないってのはどういうことですかね。
せっかくなので、runkitで全クラスに強制的にSplTypeを継承させてしまいましょう。
<?php
class HOGE{}
$classes = get_declared_classes();
class SplTypeTmp extends SplType{}
$tmp = error_reporting(0);
foreach(get_declared_classes() as $key=>$val){
if(!get_parent_class($val)){
runkit_class_adopt($val, 'SplTypeTmp');
}
}
error_reporting($tmp);
$x = new HOGE();
$x = 1; // 普通に入った
あれ?
調べてみたらrunkit_class_adoptは一見親クラスを付け替えているように見えますが、実際は本当に変更しているわけではなくエミュレーション的なことをしているみたいです。
自作クラスでも一部情報が飛んでしまい、SplTypeのような特殊なクラスではその特殊性が失われます。
ということで全自動強い型付け言語PHPの夢は破れてしまいました。
型付けとかは開発時にしか必要のない機能なので、php.iniあたりでSplType強制を設定できるようになってくれれば、とても便利だと思うのですがどうでしょう >開発者
SplTypeを使いこなせば、開発に非常に強力な武器となってくれるでしょう。
あと強い型付け言語使いから大きな顔をされることもなくなるでしょう。