80.PHPタイプ制約


タイプコンストレイント
PHP 5ではタイプコンストレイントを使用できます.関数のパラメータは、オブジェクト(関数プロトタイプにクラスの名前を指定)、インタフェース、配列(PHP 5.1から)、またはcallable(PHP 5.4から)を指定できます.ただし、パラメータのデフォルト値としてNULLを使用すると、関数を呼び出すときにNULLを実パラメータとして使用できます.
クラスまたはインタフェースがタイプコンストレイントを指定している場合、そのすべてのサブクラスまたはインプリメンテーションも同様です.
タイプコンストレイントはintやstringなどのスカラータイプでは使用できません.Traitsも許されません.
Example#1タイプ制約の例
<?php
//     
class MyClass
{
    /** *      *          OtherClass        */
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }


    /** *         *            */
    public function test_array(array $input_array) {
        print_r($input_array);
    }
}

    /** *              */
    public function test_interface(Traversable $iterator) {
        echo get_class($iterator);
    }

    /** *              */
    public function test_callable(callable $callback, $data) {
        call_user_func($callback, $data);
    }
}

// OtherClass    
class OtherClass {
    public $var = 'Hello World';
}
?> 

関数呼び出しのパラメータが定義したパラメータタイプと一致しない場合、キャプチャ可能な致命的なエラーが放出されます.
<?php
//       
$myclass = new MyClass;
$otherclass = new OtherClass;

//     :         OtherClass       
$myclass->test('hello');

//     :         OtherClass       
$foo = new stdClass;
$myclass->test($foo);

//     :         null
$myclass->test(null);

//   :   Hello World 
$myclass->test($otherclass);

//     :          
$myclass->test_array('a string');

//   :    
$myclass->test_array(array('a', 'b', 'c'));

//   :   ArrayObject
$myclass->test_interface(new ArrayObject(array()));

//   :   int(1)
$myclass->test_callable('var_dump', 1);
?> 

タイプコンストレイントは、クラスのメンバー関数だけでなく、関数にも使用できます.
<?php
//      
class MyClass {
    public $var = 'Hello World';
}

/** *      *          MyClass        */
function MyFunction (MyClass $foo) {
    echo $foo->var;
}

//   
$myclass = new MyClass;
MyFunction($myclass);
?> 

タイプ制約でNULL値を許可するには、次の手順に従います.
<?php

/*    NULL   */
function test(stdClass $obj = NULL) {

}

test(NULL);
test(new stdClass);

?>