Welcome to php club

PHP FAQ from PHPclub.ru: PHP5/ClassTypeHint ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Типизация объектов при передаче их в функции/методы

Краткое описание

PHP5, оставаясь не типизированным языком, вводит некоторую типизацию для объектов, передаваемых в виде параметров в функции и методы. Имя класса, к которому принадлежат объекты, которые принимает функция, указываются перед именем соответствующей переменной.
Пример:

<?php
interface Foo {
    function
a(Foo $foo);
}

interface
Bar {
    function
b(Bar $bar);
}

class
FooBar implements Foo, Bar {
    function
a(Foo $foo) {
        echo
"FooBar::a() что-то делает с \$foo.\n";
    }

    function
b(Bar $bar) {
        echo
"FooBar::b() что-то делает с \$bar.\n";
    }
}

$a = new FooBar();
$b = new FooBar();

//$a->a(0); // Fatal error: Argument 1 must be an object of class Foo
$a->a($b);
//$a->b(array()); // Fatal error: Argument 1 must be an object of class Bar
$a->b($b);
?>

Результат:

Следует заметить, что проверка типов производится не во время компиляции, как в типизированных языках, а во время выполнения. Это значит, что код
<?php
function foo(ClassName $object) {
    
// ...
}
?>

эквивалентен
<?php
function foo($object) {
    if (!(
$object instanceof ClassName)) {
        die(
"Аргумент 1 должен быть класса ClassName или его потомком");
    }
    
// ...
}
?>

Данный синтаксис применим только к объектам и классам, но не встроенным простым типам.

Проблемы с обратной совместимостью

Проблем с обратной совместимостью данное нововведение не имеет.

Дополнительные сведения

Описание в оригинальной документации: http://www.php.net/oop5.typehinting


 
Комментариев нет. [Показать комментарии/форму]