Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

げっ!Type Hintingで「array」が使えてたのか!

完全に見落としてました。PHP: タイプヒンティング - Manualにはしっかり

タイプヒントは、object型やarray型 (PHP5.1以降) でのみ使用できます。 int および stringのような 通常の型でのタイプヒンティングはサポートされません。

と書かれてますね。。。5.1っていつの話だよ。。。orz
異なる型を渡すとE_RECOVERABLE_ERRORが発生します。以下のサンプルは、E_RECOVERABLE_ERRORを例外に変換して投げるエラーハンドラを作っています。

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);

function catch_recoverable_error($errno, $errstr, $errfile, $errline) {
  switch ($errno) {
  case E_RECOVERABLE_ERROR:
    throw new Exception($errstr);
    break;
  }
}
set_error_handler('catch_recoverable_error');

function acceptStdClass(Traversable $value) {
    echo get_class($value) . '<br>';
}
function acceptArray(array $value) {
    foreach ($value as $value) {
        echo $value . '<br>';
    }
}

$value = new stdClass();
try {
    acceptStdClass($value);
} catch (Exception $e) {
    echo '<p>' . $e->getMessage() .'</p>';
}
echo '<hr>';

try {
    acceptArray(array(1, 2, 3));
} catch (Exception $e) {
    echo '<p>' . $e->getMessage() .'</p>';
}
echo '<hr>';
try {
    acceptArray('string');
} catch (Exception $e) {
    echo '<p>' . $e->getMessage() .'</p>';
}
echo '<hr>';
try {
    acceptArray(123);
} catch (Exception $e) {
    echo '<p>' . $e->getMessage() .'</p>';
}
echo '<hr>';