動的型付け言語PHPについて少しだけ考える
変数に型がないということの利点について考える
http://d.hatena.ne.jp/perlcodesample/20130227/1361928810
型付けと変更の時定数
http://blog.practical-scheme.net/shiro/20130227-equibillium
変数に型がないということの利点について俺も考える
http://anond.hatelabo.jp/20130301010020
最近、静的型付けと動的型付けについてエントリーが盛りがってる。
詳しくは上記のエントリーを見てください。
私はPHPとJSをメインに使うので、いわゆる動的型付け言語使いです。
だと思ってました。
が、エントリー書くうえで、wikipedia見たところ、
PHPもJavaScriptも弱い静的型付けって言うらしいです。
Rubyは強い静的型付けに分類されるようで。
まぁ、言われてみればそうだよね、という感じ。
PHPもJSも型があって、型変換やキャストがあって。
var a = '1'; // string '1' var b = 1; // int 1 var c = parseInt(a, 10); // int 1 var d = b.toString(); // string '1'
<?php $a = '1'; // string '1' $b = 1; // int 1 $c = (int)$a; //int 1 $d = (string)$b; // string '1' $e = parseInt($a); // int 1 $f = strval($b); // string '1'
しかも、こんな感じで文字列や数字の型はあるものの、わざわざキャストしなくても適当に処理してくれます。
<?php $a = 1 + '1'; // int 2 $a = 1 . '1'; // string '11'
Rubyも型変換はあるけど適当な処理はしてくれませんしね。
a = 1 + '1' //error a = 1.to_s + '1' //string '11'
あ、で、そんな基本的な事を言いたかったわけじゃなくて、
この「ゆるい」PHPの型付けのほうが個人的にはしっくりくるのですが、
まぁ、とはいえ面倒な部分もあるなと。
たとえば、PHP5.4になる前までは、関数/メソッドへの引数のタイプヒンティングにスカラー値がなかったので、関数/メソッド側で引数の型チェックを行う必要がありました。
<?php class Hoge { public static function double($expect_int) { if(!is_numeric($expect_int)){ return false; } $expect_int = intval($expect_int); return $expect_int * 2; } } echo Hoge::double('55'); // int 110 echo Hoge::double(array(5)); // false
上記みたいな単純なメソッドで無いにしろ、
型をある程度強制しないと、処理が煩雑になるケースはままあるわけで。
これがPHP5.4からはこれまでもできたarrayやobject以外にスカラー値も指定できるようになりました。
<?php class Hoge { public static function double(int $expect_int) { return $expect_int * 2; } } echo Hoge::double('55'); // error echo Hoge::double(array(5)); // error
まぁ、メソッドに「文字列」でも「数値」でもいいよ、みたいな可用性は減るので、
単純にこのスカラー引数が実装されたから万事OK!ってわけでも無いんだけどね。
時期的にようやく5.4が使われるプロジェクトが出始めたくらいだと思うので、
まだまだ5.3ベースの書き方するケースも多く、そうなると煩雑にならざるを得ないというか。
とはいえ、このままPHPが型型型型してきたらうざいと思うんですけどね。
return値の型強制まで出てきたらうざそうだなぁ・・・。
なんかグダグダしてきましたが、何が言いたいかというと、
RubyだろうがJSだろうがPHPだろうが、結局この変数がこの時何の型になってるか、というのは、
何らかの形でエンジニアが把握してないといけないわけで、
全部を正確に把握するのが難しかったりするのでキャストだー型変換だーってあるわけで。
その作業自体は慣れてくれば、PHPやJSで「こういう事すると変になる」みたいな動作って把握できちゃうわけで。
で、把握できちゃってれば問題ないけど、これから始める人にとっては問題なわけで。
そうでなくてもヒューマンエラーとかあったりするし。
でもこの問題を解決するために、メソッドが単一の型しか返せない!とかは、きっついよねー。と。
ってのが感想でした。