1

私の現在の方法:

class A {
    public function function_b($myint) {
        if (!is_numeric($myint)) return false;

        // code ...
    }
}

次のように関数 is_numeric() を放棄したいと思います。

public function function_b(Integer $myint) {
    // code ...
}

次のような配列で動作します。

public function function_c(Array $arr) {
    // only executes following code if $arr is an array / instance of Array!
}

: 値が数値 (int) でない場合、関数は false を返す必要があります。投げたくない。

現在のコードをどのように短縮しますか? 前もって感謝します!

4

4 に答える 4

3

PHP は厳密に型指定された言語ではないため、本質的に PHP の関数プロトタイプで厳密な型を強制することはできません。PHP は弱い型付けの言語であり、規則に逆らおうとすると、多くの状況で損をするだけです。また、 is_numeric は、値が int 型であることを保証しません(価値があるため)。

あなたにできることは、そもそもなぜこのアプローチが必要だと思うのかを分析し、バグの可能性を作らずにこれを最適に実装する方法を決定することです。

たとえば、メソッドが期待するのはデータベース クエリの ID である次のシナリオを考えてみましょう。

class MyClass {
    public function getUser($id) {
        if (!is_int($id)) {
            throw new Exception("Invalid argument supplied. Expecting (int), but argument is of type (" . gettype($id) . ").");
        }
        // Otherwise continue
        $db = new PDO($dsn);
        $stmt = $db->prepare("SELECT username FROM users WHERE user_id = ?");
        $stmt->execute(array($id));
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }
}

$MyObject = new MyClass;
$result = $MyObject->getUser($_POST['id']);
/* The problem here is $_POST will always be of type string. */

これが教えてくれることは、ここで型チェックを強制するのは無意味だということです。なぜなら、PHP はそのままにしておくだけで正しいことをしてくれるからです。

自問する必要がある質問は、「厳密な型指定を強制するにはどうすればよいですか?」ではなく、「厳密な型指定を強制する必要があるのはなぜですか?」です。

于 2012-12-07T01:44:25.953 に答える
2

型キャストを調べる必要があります。

値にアクセスして整数に型キャストするときに (int) を使用するだけです。

于 2012-12-07T01:32:03.320 に答える
2

あなたはそれを型キャストすることができます:

public function function_b($myint) {
    $myint = (int) $myint;
}

class Aまたは、値を設定するたびにそれを行うパブリックセッターを追加することをお勧めします。

class A
{
    public function setMyInt($myInt)
    {
        $this->myInt = (int) $myInt;
    }
}

-- 更新 (コメントに基づく) --

class A
{
    public function doSomethingWithAnArray(array $array)
    {
        ....
    }
}

メソッドのシグネチャにあるキーワード array に注意してdoSomethingWithAnArrayください。この関数に配列を渡さないと、PHP は致命的なエラーをスローしてコードの実行を停止します。これはtypehintingと呼ばれ、オブジェクトにも適用できます。

于 2012-12-07T01:33:12.983 に答える
1
function needsInteger($int) {
    if (((int) $int) != $int) return false;
    // ...
}

ここでの利点は、大まかに型指定されたパラメーターを引き続き受け入れることができることですが、キャスト値に対する厳密ではない等値チェックにより、許容可能な結果が得られます。

于 2012-12-07T02:12:16.513 に答える