是否可以编写严格类型的PHP代码?

Cli*_*ote 27 php oop

例如,是否可以编写如下代码:

int $x = 6;
str $y = "hello world";
bool $z = false;
MyObject $foo = new MyObject();
Run Code Online (Sandbox Code Playgroud)

是否可以定义这样的函数:

public int function getBalance()
{
   return 555; //Or any numeric value
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ška 53

在PHP 7中实现了"标量类型声明",例如:

public function getBalance(): int {
    return 555;
}
Run Code Online (Sandbox Code Playgroud)

您需要声明,您将使用严格类型:

<?php
    declare(strict_types=1);

    function sum(int $a, int $b): int {
        return $a + $b;
    }

    sum(1, 2);
?>
Run Code Online (Sandbox Code Playgroud)

更多信息:https://wiki.php.net/rfc/scalar_type_hints_v5

  • PHP7还为您提供了奇怪的东西为'回声零错误/警告("我想"("$ 100" +"美元")."!");`这将回声"我想0!".因此1)不写会计软件和关键系统在PHP中,如果你能帮助它,2)不要指望PHP的类型系统,以达到与Java,甚至比肩的Python会抛出像串联非弦上的东西异常. (5认同)
  • @NoBugs:该代码在PHP 7.1上引发警告:https://wiki.php.net/rfc/invalid_strings_in_arithmetic (4认同)
  • @NoBugs指出,STRONGLY类型和STRICTLY类型之间存在差异。PHP正在朝着成为一种强类型化语言的方向发展,但是它还不存在。 (2认同)
  • 另请注意,当在弱(非严格)模式下调用函数并且参数与类型声明不匹配时,参数的值将在没有警告的情况下**强制**为声明的类型。作为实现者,您无法控制此行为,如果您想在所有情况下实际对函数强制执行严格类型,则需要手动删除类型声明并检查函数定义中的类型。 (2认同)

cod*_*gar 18

编辑:此答案适用于PHP 5.6及更早版本.正如最近的答案所述,PHP 7.0及更高版本确实对此有一些支持


原始答案:

不.自php5起支持类型提示,但"类型提示只能是对象和数组(自PHP 5.1以来)类型.不支持使用int和string的传统类型提示."

就目前而言,就目前而言,如果你问我,那就应该去了.

  • 在PHP 7中,您可以指定其他类型。参见http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration (2认同)

Ale*_*ett 10

PHP没有严格的类型,所以没有.也就是说,它确实支持对函数的有限类型提示 - 尽可能接近它.


Mel*_*lsi 5

很不幸的是,不行!我现在正在完成一个涉及大量算法(图形理论,电路等)的大项目,因此我希望不要选择php。

我已经使用php大约10年了,但仍然相信它是一种好语言,但是必须决定!对我来说不好的是,缺少严格的键入可能对其他人也有好处。

另外,我想提到的是,我经常写一些额外的代码来支持严格的类型输入,这只是一个简单的例子:

if (is_array($r) && count($r)===0)
Run Code Online (Sandbox Code Playgroud)

所揭示的错误和隐藏情况等都是无法解释的。

有些错误和情况使我无法思考/发现先验,编写所有这些额外的代码虽然很麻烦,但至少它将使我免于愚蠢的错误!

如果我回去,也许我会在Web部件中选择php,您知道获取并向用户显示数据时,php很好,可以处理字符串,数组,与数据库进行对话等,但是对于主要核心,算法等,我会去C ++,也许是haskell ..不知道,至少是严格输入的东西。

  • 我会避免使用关键字“和”,因为这可能会导致无法预料的问题。查看http://stackoverflow.com/questions/2803321/and-vs-as-operator#answer-2803576 (2认同)