2011-01-11 34 views
2

你如何驗證/管理你的PHP方法參數,你爲什麼這樣做?你如何執行你的PHP方法參數?

+1

「執行」是什麼意思?你是在談論類型提示(http://php.net/manual/en/language.oop5.typehinting.php)? – svens 2011-01-11 17:23:37

+1

我認爲你的意思是_validate_。 – SLaks 2011-01-11 17:23:48

+0

你是什麼意思? – 2011-01-11 17:23:56

回答

16

好吧,假設你在談論的類型檢測方法的參數,這取決於:

  1. 如果它預期的目標,我用type-hinting與接口:

    public function foo(iBar $bar) 
    
  2. 如果期望只有一個數組,我使用array關鍵字的類型提示。

    public function foo(array $bar) 
    
  3. 如果它是期待一個字符串,整數,布爾或浮動,我投它:

    public function foo($bar) { 
        $bar = (int) $bar; 
    } 
    
  4. 如果它希望混合,我只是檢查級聯:

    public function foo($bar) { 
        if (is_string($bar)) { 
         //handle string case 
        } elseif (is_array($bar)) { 
         //... 
        } else { 
         throw new InvalidArgumentException("invalid type"); 
        } 
    } 
    
  5. 最後,如果期待可迭代類型,我不使用type-hinting。我檢查,如果它首先是一個數組,然後重新裝入迭代器:如果它期待一個文件名或目錄

    public function foo($bar) { 
        if (is_array($bar)) { 
         $bar = new ArrayIterator($bar); 
        } 
        if (!$bar instanceof Traversable) { 
         throw new InvalidArgumentException("Not an Iterator"); 
        } 
    } 
    
  6. ,只是is_file確認:

    public function foo($bar) { 
        if (!is_file($bar)) { 
         throw new InvalidArgumentException("File doesn't exist"); 
        } 
    } 
    

我認爲,處理大多數情況。如果你想到其他人,我會很樂意嘗試回答他們...

2

Typechecking是你應該在開發階段,而不是在生產階段。所以適當的句法特徵是:

function xyz($a, $b) { 
    assert(is_array($a)); 
    assert(is_scalar($b)); 

但是我會盡量避免它,或者使用類型強制優先。動態類型的PHP可以很好地適應不同的值。只有少數地方想要調整基本語言行爲。