6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPでオブジェクトの強い型付け

Posted at

前回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を使いこなせば、開発に非常に強力な武器となってくれるでしょう。
あと強い型付け言語使いから大きな顔をされることもなくなるでしょう。

6
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?