2017-09-26 86 views
3

我有點難倒了一個標量類型提示問題(PHP7應該能夠處理)。基本上,我創建了一個bool類型提示只允許布爾值傳遞的方法。但是它會失敗並讓其他類型的字符串通過。我相信在過去這對我有效。以該片段爲例。第一次轉儲導致false(這是有道理的,因爲'test'是一個字符串),第二次轉儲導致true這對我沒有意義。由於該類型不是布爾值,我希望能夠觸發PHP錯誤。有什麼想法嗎?PHP 7布爾類型提示不工作

<?php 
class Test{ 
    function something(bool $test){ 
     var_dump($test); // "Second dump" 
    } 
} 

$value = 'test'; 
var_dump(is_bool($value)); // "First dump" 
$test = new Test; 
$test->something($value); 

結果:

bool(false) 
bool(true) 
+0

在PHP 5.6由此產生一個錯誤:https://3v4l.org/ Uo7j0 – nickb

+0

您是否啓用了嚴格的輸入? –

+0

@JulienLachal我沒有。不知道在哪裏啓用它。生病谷歌那個。會及時向大家發佈。 – CodeGodie

回答

1

的問題是,PHP具有用於基元的自動轉換。可能出於哲學原因,他們很久沒有改變這一點。這究竟是爲什麼以前基本類型提示被禁止在PHP中:https://bugs.php.net/bug.php?id=29508

由於PHP具有自動轉換,你應該這樣做是爲了確保:

class Test{ 
    function something($test){ 
     if(!is_bool($test)) { 
      throw new InvalidArgumentException("Boolean expected."); 
     } 
    } 
} 

編輯:閱讀在PHP標量類型提示下面的文章7 https://www.phpclasses.org/blog/post/269-PHP-7-Scalar-Type-Hinting-Finally-Approved.html

在PHP 7它最終可能通過添加

declare(strict_types=1); 
使含有原語類型檢查工作的碼0

在文件的開頭。

+1

使它成爲InvalidArgumentException – delboy1978uk

1

神奇的功能,您要找的是這一個。把它放在你班上面的第一行!現在

declare(strict_types=1) ; 

你的代碼看起來klike這樣的:

<?php 
declare(strict_types=1) ; 

class Test{ 
    function something(bool $test){ 
     var_dump($test); // "Second dump" 
    } 
} 

$value = 'test'; 
var_dump(is_bool($value)); // "First dump" 
$test = new Test; 
$test->something($value); 

現在,它會拋出一個錯誤! http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict

看到它在這裏工作:https://3v4l.org/eLS1T

最後一點,你需要設置一個每個文件的基礎