PHP类型提示原始值?

Fel*_*ida 72 php type-hinting primitive-types

我想知道是否可以键入提示方法以期望原始类型?

像这样的东西:

public function someMethod(string $str)
                         //^^^^^^
Run Code Online (Sandbox Code Playgroud)

要么:

private function anotherMethod(int $num)
                             //^^^
Run Code Online (Sandbox Code Playgroud)

你会这样:

private function otherMethod(Person $rambo)
                           //^^^^^^
Run Code Online (Sandbox Code Playgroud)

这可能在PHP吗?

afu*_*ama 84

在PHP 7中,他们添加了以下内容:

类型声明允许函数在调用时要求参数具有某种类型.如果给定值的类型不正确,则会生成错误:在PHP 5中,这将是可恢复的致命错误,而PHP 7将引发TypeError异常.

参考:http: //php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration


当得到这个答案时,PHP 5是最新的,并说如下:

PHP 5引入了类型提示.函数现在能够强制参数为对象(通过在函数原型中指定类的名称),接口,数组(自PHP 5.1起)或可调用(自PHP 5.4起).但是,如果将NULL用作默认参数值,则允许将其作为后续调用的参数.

如果将类或接口指定为类型提示,那么也允许其所有子项或实现.

类型提示不能与标量类型(如int或string)一起使用.资源和特征也是不允许的.

参考:http://php.net/manual/en/language.oop5.typehinting.php

  • @afuzzyllama w3schools*不是*w3c.w3c一直困扰着他们,不要误导人们认为他们是他们.PHP开发人员声称它是强类型的(这实际上是强类型的唯一必要条件),但事实并非如此.当我评论它是强类型的时候,我不知道我在想什么. (21认同)

Raf*_*ler 29

不.您不能为基元键入提示,因为PHP具有基元的自动转换.见http://bugs.php.net/bug.php?id=29508.这将永远不会改变,除非PHP团队突然改变主意(这是令人怀疑的,他们非常顽固).

  • 2015年更新和即将推出的PHP7:http://www.phpclasses.org/blog/post/269-PHP-7-Scalar-Type-Hinting-Finally-Approved.html (9认同)

Pur*_*tam 16

是的,现在可能了,经过长时间的讨论,实施标量函数参数和返回值的类型提示的提议刚刚获得批准,目前为止投票数最多,请查看详细信息:

标量类型提示包括声明函数参数的类型和返回值,可以是int,float,string和bool类型.这允许PHP运行时引擎检查传递给参数函数和返回值的值的类型是否为预期的类型,以检测最终的编程错误.在过去的PHP版本中已经允许对对象,数组和可调用对象进行类型提示.当前的实现引入了五个新的保留字:int,float,bool,string和numeric.这些以前没有保留过,因为在词法分析器中,转换是一种特殊情况.

Example :
function test(float $a) {
    var_dump($a); 
}

test(1); // float(1)
test("1"); // float(1)
test(1.0); // float(1)
test("1a"); // E_RECOVERABLE_ERROR
test("a"); // E_RECOVERABLE_ERROR
test(""); // E_RECOVERABLE_ERROR
test(1.5); // float(1.5)
test(array()); // E_RECOVERABLE_ERROR
test(new StdClass); // E_RECOVERABLE_ERROR
Run Code Online (Sandbox Code Playgroud)

您还可以选择声明到源文件,您可以在其中允许Scaler类型提示.它必须是您的配置脚本的第一行,并且不能在同一文件的其他地方声明.

Like : declare(strict_types=1);
Run Code Online (Sandbox Code Playgroud)

在运行时,当PHP引擎尝试返回一个值时,它会检查是否不匹配,因为它会抛出致命错误,例如,致命错误:传递给increment()的参数1必须是整数类型,给定字符串

利用声明的这一新功能,您可以通过检测将错误类型的值传递给函数所导致的早期编程错误来编写更强大的应用程序.

类型的自动更改也可能发生.例如,int类型可以自动更改为float类型参数,

function test(float $x){
    var_dump($x);
}
test(10); // works fine
Run Code Online (Sandbox Code Playgroud)

声明返回类型

我们可以声明返回类型,添加冒号,后跟函数声明中最后一个括号和第一个括号之间的预期类型.

对于不返回任何值的函数,不应在返回类型声明部分中添加任何内容.

function mustReturnInt(): int { ... }
function mustReturnString(): string { ... }
function mustReturnBool(): bool { ... }
function mustReturnFloat(): float { ... }
function doesNotReturnAnything() { ... }
Run Code Online (Sandbox Code Playgroud)

一点点更复杂的例子

declare(strict_types=1);  
class StrictTypesTestingClass {  
public function returnSameInt(int $value): int {   return $value;  }   
public function returnSameFloat(float $value): float {   return $value;  }  
public function returnSameString(string $value): string {   return $value;  }   
public function returnSameBool(bool $value): bool {   return $value;  } }  
$check = new StrictTypesTestingClass();  // calls that work  print $check->returnSameInt(10); 
print $check->returnSameFloat(10.0); 
print $check->returnSameString("test"); 
print $check->returnSameBool(true) ? 'true' : 'false';  // calls that throw exceptions 
print $check->returnSameInt("10"); 
print $check->returnSameFloat("10.0"); 
print $check->returnSameString(10);
print $check->returnSameBool("true");
Run Code Online (Sandbox Code Playgroud)

弱类型检查和类型转换的行为:弱类型检查模式可以与语句declare(strict_types = 0)一起使用; 或没有严格的类型声明.有几点需要考虑:对扩展或内置PHP函数的弱类型检查调用与以前的PHP版本具有相同的行为新标量类型声明的弱类型检查规则大多与新的标量类型声明相同.扩展或内置PHP函数.NULL是一种特殊情况,以便与类,callables和数组的当前类型声明一致.默认情况下不接受NULL,除非它是一个参数并且显式地给出了默认值NULL,例如:function sample(int $ a = NULL);

这种方法有很多优点.你得到了类型安全.这意味着您最终可以静态分析代码!您可以检测到意外从一个函数中获取字符串并将其作为整数传递给另一个函数的错误.对我来说,每天都使用PHP并将Java视为OOP语言的参考的开发人员,这是PHP的一个很好的进步.

  • 这是PHP 7的RFC.https://wiki.php.net/rfc/scalar_type_hints_v5 (4认同)

TCB*_*B13 5

每个人都已经说过了,你不能为原语键入提示,因为PHP不支持它.这背后的原因不仅与自动转换有关,还与社区反应有关.

到目前为止,我记得在2010年5月,PHP主干中添加了对标量类型提示的支持.但是由于社区的反应,这个功能没有进入5.4版本.

对此存在一些争议.那些反对这种变化的人认为这种支持会违背PHP的基本设计.PHP被认为是弱类型语言.实质上,这意味着PHP不要求您声明数据类型.变量仍然具有与它们相关联的数据类型,但是您可以执行诸如将字符串添加到整数而不会导致错误的激进事情.

恕我直言:标量类型提示应该尽快添加到PHP中,这是我们都需要的功能,我真的很尊重PHP是弱类型语言,但对于高端开发和生产,特别是在OO上下文中,标量类型提示是必须的.我们可以在PHP中有两种选择,就像程序和OO一样.