new takyam();

Qiitaぽい話はQiitaに書いていくことにする気がする http://qiita.com/takyam

動的型付け言語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は強い静的型付けに分類されるようで。

http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%AE%E6%AF%94%E8%BC%83

まぁ、言われてみればそうだよね、という感じ。
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で「こういう事すると変になる」みたいな動作って把握できちゃうわけで。
で、把握できちゃってれば問題ないけど、これから始める人にとっては問題なわけで。
そうでなくてもヒューマンエラーとかあったりするし。

でもこの問題を解決するために、メソッドが単一の型しか返せない!とかは、きっついよねー。と。

ってのが感想でした。