Контроль типа


PHP 5 предоставляет возможность использовать контроль типов. На данный момент функции имеют возможность заставлять параметры быть либо объектами (путем указания имени класса в прототипе функции), либо интерфейсами, либо массивами (начиная с PHP 5.1), или колбеком с типом callable (начиная с PHP 5.4). Однако, если NULL использовался как значение параметра по умолчанию, то это будет также допустимо в качестве аргумента для последующего вызова.

Если класс или интерфейс указан для контроля типа, то все его потомки или реализации также допустимы.

Контроль типа не может быть использован со скалярными типами, такими как int или string. Ресурсы и Трейты также недопустимы.

Пример #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);
    }
    
    
/**
     * Первый параметр должен быть типа callable
     */
    
public function test_callable(callable $callback$data) {
        
call_user_func($callback$data);
    }
}

// Другой тестовый класс
class OtherClass {
    public 
$var 'Hello World';
}
?>

В случае передачи аргумента неправильного типа результатом будет фатальная ошибка.

<?php
// Экземпляры каждого класса
$myclass = new MyClass;
$otherclass = new OtherClass;

// Ошибка: Аргумент 1 должен быть экземпляром класса OtherClass
$myclass->test('hello');

// Ошибка: Аргумент 1 должен быть экземпляром класса OtherClass
$foo = new stdClass;
$myclass->test($foo);

// Ошибка: Аргумент 1 не должен быть null
$myclass->test(null);

// Работает: Выводит Hello World
$myclass->test($otherclass);

// Ошибка: Аргумент 1 должен быть массив
$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);

?>