2017-08-15 22 views
0

我明白爲什麼使用按值返回方法重寫通過引用返回的方法可能是不好的樣式。怎麼樣通過引用返回值方法覆蓋返回值的方法?我問,因爲PhpStorm檢測到前者,但不是後者。PHP - 返回按值和By-Ref方法重寫

PhpStorm調用Sub :: baseReturnsByRef作爲「聲明應該與super兼容」。

class Base { 
    function & baseReturnsByRef(&$something) { 
     return $something; 
    } 
} 

class Sub extends Base { 
    function baseReturnsByRef(&$something) { 
     return $something; 
    } 
} 

PhpStorm是媽媽在下面......

class Base { 
    function baseReturnsByRef(&$something) { 
     return $something; 
    } 
} 

class Sub extends Base { 
    function & baseReturnsByRef(&$something) { 
     return $something; 
    } 
} 

是否有解釋爲什麼這可能是確定的面向對象或其他CS理論?

回答

1

我問,因爲PhpStorm檢測前者而不是後者

好 - PhpStorm做同樣的東西PHP本身報告(如PHP 7.0 - 5.6正常。):

警告:次聲明:: baseReturnsByRef(& $東西)應與&基地:: baseReturnsByRef兼容(& $東西)

這必須改變: http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.error-handling.strict - 「繼承中籤名不匹配」


是否有解釋爲什麼這可能是確定的面向對象或其他CS理論?

無法正確(可靠地)回答這個部分。

我唯一的解釋:如果函數參數接受值並且您傳遞了引用..它將起作用,因爲PHP會自動爲您「解析」它。

但是...如果參數期望引用...那麼它不能接受原始值。

這裏也可以應用相同的邏輯:第二個例子是可以的,因爲在第一個例子中,返回值仍然可以自動「未被引用」,而不能完成。