php-パラメータに複数のタイプヒントを指定することは可能ですか?
答え :
解決策:
これは 次に、電話をかけると、次のように機能します。
これらはしません:
->foobar($baz)メソッドがあることを確認したい場合は、次のインターフェースを期待できます。
interface iFooBar {
public function foobar($baz);
}
class Foo implements iFooBar {
public function foobar($baz) { echo $baz; }
}
class Bar implements iFooBar {
public function foobar($baz) { print_r($baz); }
}
function doSomething(iFooBar $foo) {
$foo->foobar('something');
}
doSomething(new Foo());
doSomething(new Bar());
doSomething(new StdClass());
doSomething('testing');
答え :
解決策:
すばらしい質問です。これは、IDEドキュメントとPHP 5
基本クラスを作成して拡張すると、タイプヒントは基本クラスになります...すべての拡張クラスが機能します。以下の例を参照してください。
//
$test = new DUITest();
// Calls below will work because of polymorphism
echo $test->test(new Molecule()) . '<br/>';
echo $test->test(new Vodka()) . '<br/>';
echo $test->test(new Driver()) . '<br/>';
echo $test->test(new Car()) . '<br/>';
// Will not work because different data type
echo $test->test(new Pig()) . '<br/>';
echo $test->test(new Cop()) . '<br/>';
echo $test->test('test') . '<br/>';
echo $test->test(array()) . '<br/>';
/**
* Class to test
*/
class DUITest {
public function __construct() {
;
}
/**
* Using type-hinting
*
* See below link for more information
* @link http://www.php.net/manual/en/language.oop5.typehinting.php
*
* @param Molecule|Car|Driver|Vodka $obj
*/
public function test(Molecule $obj) {
echo $obj;
}
}
/**
* Base Class
*/
class Molecule {
public function __construct() {}
/**
* Outputs name of class of current object
* @return <type>
*/
public function __toString() {
return get_class($this);
}
}
class Car extends Molecule {}
class Driver extends Molecule {}
class Vodka extends Molecule {}
class Pig {}
class Cop extends Pig{}
答え :
解決策:
これを強制することはできません(メソッド内を除く)。単一のタイプのヒントのみを提供でき、オブジェクト/インターフェースおよび配列にのみ提供できます(PHP 5.1以降)。
ただし、メソッドに文書化することはできます/すべきです。つまり、次のようになります。
/**
* @param string|Bar|Baz $param1
*/
function foo($param1);
答え :
解決策:
この記事の執筆時点では、複数の明示的な型はサポートされていません。ドキュメントとPHPの動的型システムに依存する必要があります。
ただし、 これは私が非常に価値があると思うものの簡単な例です: 残念ながら、RFCは合格しませんでした。ただし、特定のタイプの array | Traversable :
function map(callable $fn, array|Traversable $input) {
foreach ($input as $key => $value) {
yield $key => $fn($value);
}
}
array|Traversable には、まさにそれである
iterable
タイプがあります。
答え :
解決策:
array
またはクラス名である必要があります。stringをヒントにすることはできません)が、これを行うには、
{-code-を使用して、関数内のパラメーターのタイプを確認します。 3}
:
function foo($ param)
{{
if(!(is _ string($ param)|| in _ array(get_class($ param)、array( "Bar"、 "Baz" ))))
{{
// $ paramのタイプが無効です!
}
}
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。