80.PHPタイプ制約
5546 ワード
タイプコンストレイント
PHP 5ではタイプコンストレイントを使用できます.関数のパラメータは、オブジェクト(関数プロトタイプにクラスの名前を指定)、インタフェース、配列(PHP 5.1から)、またはcallable(PHP 5.4から)を指定できます.ただし、パラメータのデフォルト値としてNULLを使用すると、関数を呼び出すときにNULLを実パラメータとして使用できます.
クラスまたはインタフェースがタイプコンストレイントを指定している場合、そのすべてのサブクラスまたはインプリメンテーションも同様です.
タイプコンストレイントはintやstringなどのスカラータイプでは使用できません.Traitsも許されません.
Example#1タイプ制約の例
関数呼び出しのパラメータが定義したパラメータタイプと一致しない場合、キャプチャ可能な致命的なエラーが放出されます.
タイプコンストレイントは、クラスのメンバー関数だけでなく、関数にも使用できます.
タイプ制約でNULL値を許可するには、次の手順に従います.
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);
?>