2016-12-08 7 views
3

phpでは、以下は機能的に同等かどうか疑問に思っていますか?タイプヒントとタイプキャスティングsetter php

class Foo { 
    public $bar; 
    ... 
    public function setBar($bar) { 
     $this->bar = (array)$bar; 
    } 
} 


class Foo { 
    public $bar; 
    ... 
    public function setBar(array $bar) { 
     $this->bar = $bar; 
    } 
} 

どちらがベストプラクティスと考えられますか?両方を行うことは理にかなっていますか?:

class Foo { 
    public $bar; 
    ... 
    public function setBar(array $bar) { 
     $this->bar = (array)$bar; 
    } 
} 
+1

いいえ、機能的に同等ではありません。タイプヒントは予期しない値を渡そうとするとエラーをスローし、タイプキャスティングは値のタイプを変更しようとします。 –

答えて

5

機能的に同等ではありません。

タイプヒント:どのタイプを渡す必要があるかを指定しています。指定された値のタイプが正しくない場合、エラーが生成されます。これは、渡された値を特定の型にキャストまたは変換しません。

タイプキャスト:どの値が渡されても、正しいタイプに変換されます。関数が配列を必要とする場合は、なぜブール値を渡してから配列にキャストするのですか?

また、タイプヒントでは、特定のクラスのオブジェクトインスタンスを指定できます。あなたが特定のクラスのオブジェクトに変数をキャスト入力することはできません

public function setBar(Bar $bar) 

:以下では、$barは他のクラスBarまたはエラーが発生したのインスタンスでなければなりません。デフォルトでは

+0

ありがとう...タイプヒントのみを使用すると、$ this-> barが配列()であることが保証されますか(エラーがないと仮定します)? – mcmurphy

+0

両方のことを行う技術的理由もありますか? – mcmurphy

+0

いいえ。エラーが発生していない場合はスローされます。値をキャストまたは変換しません。編集済み... – AbraCadaver

1

Type Hinting from PHP docs:

可能な場合、PHPは、予想されるスカラー型に間違った型の値を強制します。たとえば、文字列を必要とするパラメータに整数を指定した関数は、文字列型の変数を取得します。 strict_typeが無効になっている

場合、PHPは、例えば、値をキャストしようとします:

function myFunction(int $bar) { 
    echo 'Received value: ' . $bar . ' ' . gettype($bar); 
} 

$foo = '12'; 

echo 'Passed value: ' . $foo . ' ' . gettype($foo); 

myFunction($foo); 

が印刷されます:あなたのケースでは

Passed value: 12 string 
Received value: 12 integer 

は、あなたが使用する必要はありません可能であれば、PHPがキャストしようとすると、そうでない場合は、エラーがトリガーされるので、それは両方のオプションよりも優先されます。

class Foo { 
    public $bar; 
    ... 
    public function setBar(array $bar) { 
     $this->bar = $bar; 
    } 
} 
関連する問題