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

时间:2009-10-02 23:34:18

标签: php oop

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

int $x = 6;
str $y = "hello world";
bool $z = false;
MyObject $foo = new MyObject();

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

public int function getBalance()
{
   return 555; //Or any numeric value
}

10 个答案:

答案 0 :(得分:49)

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

public function getBalance(): int {
    return 555;
}

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

<?php
    declare(strict_types=1);

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

    sum(1, 2);
?>

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

答案 1 :(得分:18)

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


原始答案:

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

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

答案 2 :(得分:9)

PHP没有严格打字,所以没有。也就是说,它确实支持有限的type hinting函数 - 尽可能接近它。

答案 3 :(得分:5)

不幸的是没有!我现在正处于一个大项目的最后,涉及很多算法(图论,电路等),我希望我没有选择php。

我已经使用php大约10年了,仍然相信它是一种很好的语言,但是必须要决定!什么对我不利,缺乏严格的打字可能对其他人有好处。

另外,我想提一下,我经常编写额外的代码来支持严格打字,只是一个简单的例子:

if (is_array($r) && count($r)===0)

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

有一些错误和情况,我永远无法想到/检测到先验,写下所有这些额外的代码并没有享受,但至少它会让我免于愚蠢的错误!

如果我愿意回去,也许我会为网页部分选择php,你知道获取并向用户显示数据,php对此非常有用,处理字符串,数组,与数据库交谈等等,但对于主要核心,算法等我会去C ++,也许haskell ..不知道,至少是严格键入的东西。

答案 4 :(得分:3)

为了模拟穷人的严格类型检查,您可能会尝试使用assert()在返回之前强制输出为特定类型:

/**
 * Get Balance
 *
 * @return int
 */
function getBalance()
{
    /* blah blah blah */
   $out = 555; //Or any numeric value
   assert('is_int($out)');
   return $out;
}

因此,在整个开发和测试过程中,您的断言都会保持活动状态,就像编译器在编译时所做的检查一样。

当然,assert()页面热衷于断言你不应该使用断言来检查输入参数,而是使用正常的条件来检查它们。

This answer我认为这是一个很好的规则:

  

适用于大多数语言的经验法则(我隐约知道)是断言用来断言条件总是正确而if是合适的,如果可以想象它有时会失败。< / p>

如果您正在模拟严格的类型检查(编写代码以恶意维护类型;不尝试验证来自外部的输入),那么除非您犯了错误,否则您应该确定类型是什么。< / p>

更新

还有:http://hacklang.org/ Facebook基于PHP的静态打字语言。

答案 5 :(得分:3)

也许你应该试试这个PHP扩展https://github.com/krakjoe/strict。引入了对以下类型的支持:

  • 字符串
  • integer,int
  • float,double
  • 布尔,布尔
  • 资源

答案 6 :(得分:1)

没有。该语法不起作用。

从理论上讲,你可以提出一个对象系统来强制执行他们自己的严格打字,但它不会执行,而且......无论如何,你为什么要这样做?

如果您需要严格打字,请使用严格打字的语言。

答案 7 :(得分:1)

由于答案基本上是“否”,所以另一种选择:PHP“linter”,它应该捕获一些编译时检查会捕获的静态类型语言,如C.不一样,但应该防止一些愚蠢

"Is there a static code analyzer [like Lint] for PHP files"列出了其中许多内容。

答案 8 :(得分:0)

您可以使用h2tp transpiler将HACK代码转换为PHP:

感谢Facebook团队和 HACK语言,你可以做到这一点。

访问http://hacklang.orghttp://hhvm.com了解详情。

如果您想直接在Hack + HHVM环境中编码,您还可以使用Facebook的内部IDE Nuclide

答案 9 :(得分:0)

PHP 7.0 引入了函数返回类型提示,PHP 7.4 添加了对类属性类型提示的支持。从 PHP 7.4 开始,您的代码将是:

<?php declare(strict_types=1);

class MyObject
{
}

class TypedStuff
{
  public static int $x;
  public static string $y;
  public static bool $z;
  public static MyObject $foo;
}

function getBalance(): float
{
  return 555; //Or any numeric value
}

TypedStuff::$x = 6;
TypedStuff::$y = "hello world";
TypedStuff::$z = false;
TypedStuff::$foo = new MyObject();

您不能对一次性变量进行类型提示,但可以对静态类属性进行类型提示,这可以以几乎相同的方式使用。您还可以键入提示独立函数的返回类型。

更常见的是,您将使用类型化 setter 在类内定义类型化值,并使用类型化 getter 在类外接收类型化值,例如:

<?php declare(strict_types=1);

class Person {
  private $age;

  public function __construct(int $age)
  {
    $this->age = $age;
  }

  public function setAge(int $age): void { $this->age = $age; }
  public function getAge(): int { return $this->age; }
}

$person = new Person(30);
echo sprintf(
  'The person is %d years old.',
  $person->getAge()
);

这在 PHP 7.0 中有效,因为不需要属性类型提示。