PHP5 引数の型を指定する

notoです。

オープンソースを眺めていると、引数で型を指定しているのを見かけたことありませんか? マニュアルをみるとタイプヒンティングと呼ばれているようです。

タイプヒンティングを軽く検証してみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
class Hoge {

    private $animal;

    /**
     * 渡せる型をLion型のみと制限する。
     * @param Lion $lion
     */
    public function setAnimal(Lion $lion){
        $this->animal = $lion;
    }

    public function howl(){
        echo $this->animal->howl(), PHP_EOL;
    }

}

class Lion {

    public function howl(){
        return 'がおー!';
    }
}

class Cat {

    public function howl(){
        return 'にゃー';
    }

}

$hoge = new Hoge();
$hoge->setAnimal(new Cat());
$hoge->howl();

setAnimalメソッドの引数をLion型に制限しています。定義方法は、クラス型 変数で定義します。 Javaと同じですね。

Lion型を渡してねと定義されているsetAnimalメソッドにCat型を渡してみました。

実行結果
1
PHP Catchable fatal error:  Argument 1 passed to Hoge::setAnimal() must be an instance of Lion, instance of Cat given

Cat型を渡すんじゃねーよ。Lion型寄越せと怒られます。 ではLion型を渡してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
class Hoge {

    private $animal;

    /**
     * 渡せる型をLion型のみと制限する。
     * @param Lion $lion
     */
    public function setAnimal(Lion $lion){
        $this->animal = $lion;
    }

    public function howl(){
        echo $this->animal->howl(), PHP_EOL;
    }

}

class Lion {

    public function howl(){
        return 'がおー!';
    }
}

class Cat {

    public function howl(){
        return 'にゃー';
    }

}

$hoge = new Hoge();
$hoge->setAnimal(new Lion());
$hoge->howl();
実行結果
1
がおー!

Lion型が渡されたので、Fatal Errorが発生することなく正しく処理されました。

もちろんインターフェースもいけますよ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
class Hoge {

    private $animals;

    /**
     * 渡せる型をAnimal型のみと制限する。
     * @param Animal $animal
     */
    public function setAnimal(Animal $animal){
        $this->animals[] = $animal;
    }

    public function howl(){
        foreach ($this->animals as $animal) {
            echo $animal->howl() , PHP_EOL;
        }
    }

}

class Lion implements Animal {

    public function howl(){
        return 'がおー!';
    }
}

class Cat implements Animal {

    public function howl(){
        return 'にゃー';
    }

}

interface Animal {

    public function howl();

}

$hoge = new Hoge();
$hoge->setAnimal(new Lion());
$hoge->setAnimal(new Cat());
$hoge->howl();
実行結果
1
2
がおー!
にゃー

注意点としては、

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

array型縛れるのはいいですね。個人的にはphpでも型は意識すべきだと思っているので利用できるところは利用したいと思います。

参考

タイプヒンティング

Comments