web-dev-qa-db-ja.com

引数を整数/文字列にする方法

次のように、関数に文字列/整数を期待するか、適合をスローさせたいです。

警告:preg_match()はパラメータ2が文字列であることを期待しています

ただし、この機能では

public function setImage($target, $source_path, integer $width, integer $height){...

私は得ます:

My_Helper_Image :: setImage()に渡される引数4は整数のインスタンスである必要があります

だが:

function(array $expectsArray)

期待どおりに動作しますが、整数や文字列と同じ効果をどのように実現できますか?

大きなアップデート

PHP 7になりました スカラー型ヒントをサポートしています

function increment(int $number) {
     return $number++;
}
21
Moak

スカラーTypeHintは、PHP 7 以降で使用できます:

スカラー型宣言には、強制(デフォルト)と厳密の2つのフレーバーがあります。次のタイプのパラメーターを強制的に(強制的にまたは厳密に)強制できます:文字列(string)、整数(int)、浮動小数点数(float)、およびブール値(bool)。これらは、PHP 5:クラス名、インターフェース、配列、および呼び出し可能オブジェクトで導入された他のタイプを補強します。

PHP7より前のスカラーにはタイプヒントはありません。 PHP 5.3.99にはスカラータイプヒントがありました ですが、それらが残っているかどうか、およびそのときの動作方法は、その時点では確定されていません。

それにもかかわらず、PHP7より前にスカラー引数を強制するオプションがあります。

いくつかありますis_*それを可能にする関数。

警告を発生させるには、

E_USER_WARNING ために $errorType

function setInteger($integer)
{
    if (FALSE === is_int($integer)) {
        trigger_error('setInteger expected Argument 1 to be Integer', E_USER_WARNING);
    }
    // do something with $integer
}

オルタナティブ

スカラー型ヒントを必死に使いたい場合は、

これは、カスタムエラーハンドラーを介してスカラータイプヒントを適用する手法を示しています。

25
Gordon

(int)$ heightのような「タイプジャグリング」を使用できます。

例えば:

function setImage($target, $source_path, integer $width, $height) {
    $height = (int)$height;
    ...
}
5
Frank

PHPは(まだ)厳密な型指定を実装していないため、パラメーターを強制的に整数にすることはできません。これは、クラス($ widthがクラス整数のインスタンスでなければならないことを意味するエラー)と配列にのみ適用されます。

クラスの型ヒントは、PHP 5、5.1以降の配列の型ヒントで利用できます。将来的にはスカラー型ヒントが利用可能になる可能性があります)。

もちろん、他の人が指摘したように、関数/メソッド内で型をチェックすることもできますが、これは厳密な型指定とは根本的に異なります。もちろん、望ましい効果はどちらの方法でも得られます。

2
Peter Lindqvist

PHP 7.xを使用していない場合、または args module from Non-standard PHP library (NSPL) 。これは派手ではなく、PHP 7.xの型ヒントですが、検証を行います。

use const \nspl\args\numeric;
use function \nspl\args\expects;

function sqr($x)
{
    expects(numeric, $x);
    return $x * $x;
}

sqr('hello world');

出力:

InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17

Call Stack:
    0.0002     230304   1. {main}() /path/to/example.php:0
    0.0023     556800   2. sqr() /path/to/example.php:17
0