2015-12-08 93 views
1

因此,PHP 7的标量类型现在已经提示(w00t!),您可以根据PHP中的设置将类型提示设置为严格或非严格。 Laracasts使用define,IIRC来设置它。PHP 7:同时使用严格和非严格类型提示?

有没有一种方法可以在一个文件(比如数学库)中对标量进行严格类型提示,同时在其他地方使用非严格的代码而不需要在代码中随意更改设置?

我想避免通过不习惯使用语言设置来引入错误,但我喜欢这个想法。

+0

PS - 我不允许任何人更改可移植性的语言设置,并且在执行过程中更改它们会被处以流放处罚。 –

回答

4

事实上,你可以混合和匹配你心中的内容,实际上这个功能是专门设计用来这样工作的。

declare(strict_types=1);不是语言设置或配置选项,它是一个特殊的每个文件声明,有点像namespace ...;。它只适用于你使用它的文件,它不会影响其他文件。

因此,举例来说:

<?php // math.php 

declare(strict_types=1); // strict typing 

function add(float $a, float $b): float { 
    return $a + $b; 
} 

// this file uses strict typing, so this won't work: 
add("1", "2"); 

<?php // some_other_file.php 

// note the absence of a strict typing declaration 

require_once "math.php"; 

// this file uses weak typing, so this _does_ work: 
add("1", "2"); 

返回打字的工作方式相同。 declare(strict_types=1);适用于函数在文件中调用(NOT declarations)和return语句。如果您没有declare(strict_types=1);语句,则该文件使用“弱类型”模式。

+1

我很失望,当人们在我的库中调用方法时,我无法执行严格的打字。也许是7.1的一个功能? :) –

+0

@DerrekBertrand如果你真的想,你可以做一些像'<?php declare(strict_types = 1);函数myPublicFunc(... $ args){return _myPublicFunc(... $ args); }函数_myPublicFunc(int $ foo,string $ bar){/ *实际函数在这里* /}' – Andrea

+0

我更加难过,要想让你的调用堆栈变得更加肮脏或者使用这样的黑魔法,这是无法完成的。甜蜜的伎俩! –