2017-10-16 68 views
3

我有需要字符串作爲輸入參數的函數:PHP 7嚴格類型對象字符串的轉換

<?php 
declare(strict_types = 1); 

function testXml(string $xml) { 
    echo "this is a string: " .$xml; 
} 

現在,當我喂該功能的對象,我期望被拋出類型錯誤。 但是,這是不是這樣,類型的SimpleXMLElement的一個目的是默默轉換爲字符串: https://3v4l.org/lQdaZ

這是一個錯誤或功能?

回答

6

As的magic function__toString()的文檔解釋:

__toString()方法允許一個類決定當它像一個字符串處理它會如何反應。

由於類SimpleXmlElement實現__toString()魔術方法,它(該方法)被調用每次使用SimpleXmlElement時間,其中的字符串被期待。使用__toString()返回的值代替對象。

很難判斷這是一個功能還是bug 。函數testXml()當前需要一個字符串作爲參數,您不會因爲它默默接受SimpleXmlElement而感到高興。

如果刪除其參數的類型,則不會再發生對__toString()的調用,並且函數內$xml參數的值爲SimpleXmlElement對象。對__toString()的調用發生在echo "this is a string: " .$xml;行,即使它不是字符串,也可以打印$xml的值,這非常方便。

如果您認爲它是一個錯誤,然後echo(它期望字符串作爲參數)應該抱怨$xml的類型,不應該打印它。不那麼方便,不是嗎?


這是不是一個錯誤,這是語言如何進化的。 __toString()是爲標量類型在type declarations之前引入的,爲了不打破現有行爲,在可能的情況下調用它,而不是觸發關於不正確類型參數的錯誤。

+0

感謝您的詳細解釋,唉,我覺得它很刺激。 – dev0

+0

我發現更令人不安的是,該對象在phpunit單元測試中轉換爲空字符串 – dev0

+0

它是一個真實的對象還是一個模擬對象? – axiac

1

這是一個功能,PHP是調用 - 如果定義 - 對象的__toString -Magic方法:

<?php 
class ClassImplementingToString 
{ 
    public function __toString() 
    { 
     return "hello world"; 
    } 
} 

function foo(string $foo) 
{ 
    echo $foo; 
} 

foo(new ClassImplementingToString()); 

將輸出:hello world

相關問題