首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP类型-提示原始值?

PHP类型-提示原始值?
EN

Stack Overflow用户
提问于 2011-04-20 09:43:59
回答 5查看 43.1K关注 0票数 74

我想知道是否可以通过类型提示方法来预期原始类型?

如下所示:

代码语言:javascript
复制
public function someMethod(string $str)
                         //^^^^^^

或者:

代码语言:javascript
复制
private function anotherMethod(int $num)
                             //^^^

用同样的方法:

代码语言:javascript
复制
private function otherMethod(Person $rambo)
                           //^^^^^^

这在php中是可能的吗?

EN

回答 5

Stack Overflow用户

发布于 2011-04-20 09:50:01

不是的。你不能为基元类型输入提示,因为PHP有基元类型的自动转换。参见http://bugs.php.net/bug.php?id=29508。这一点永远不会改变,除非PHP团队突然改变主意(这是值得怀疑的,因为他们相当固执)。

票数 29
EN

Stack Overflow用户

发布于 2015-03-23 15:36:18

是的,现在有可能了,经过长时间的讨论,一项为标量函数参数和返回值实现类型提示的提案刚刚以迄今为止最高的票数通过,详情请查看:

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

代码语言:javascript
复制
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

你还可以选择声明到源文件中,在那里你可以允许定标器类型hinting.It必须是你配置脚本的第一行,并且不能在同一文件中的其他地方声明。

代码语言:javascript
复制
Like : declare(strict_types=1);

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

有了这个声明的新特性,您可以通过检测由于将错误类型的值传递给函数而导致的早期编程错误来编写更健壮的应用程序。

类型的自动更改也可能发生。例如,整型类型可以自动更改为浮点型参数,

代码语言:javascript
复制
function test(float $x){
    var_dump($x);
}
test(10); // works fine

声明返回类型

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

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

代码语言:javascript
复制
function mustReturnInt(): int { ... }
function mustReturnString(): string { ... }
function mustReturnBool(): bool { ... }
function mustReturnFloat(): float { ... }
function doesNotReturnAnything() { ... }

稍微复杂一点的例子

代码语言:javascript
复制
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");

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

这种方法有很多优点。你得到了类型安全。这意味着你终于可以静态地分析代码了!你可以检测到错误,你意外地从一个函数中获取了一个字符串,并将其作为一个整数传递给another.For me,他是一个每天使用PHP语言的开发人员,并将Java视为面向对象编程语言的参考,这对PHP语言来说是一个巨大的进步。

票数 17
EN

Stack Overflow用户

发布于 2011-04-20 09:50:55

基元类型不支持Accordind to PHP documentation类型提示。

不过,它支持类和接口。

编辑:我忘了提一下,数组也支持它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5724677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档