例如,是否可以编写如下代码:
int $x = 6;
str $y = "hello world";
bool $z = false;
MyObject $foo = new MyObject();
是否可以定义这样的函数:
public int function getBalance()
{
return 555; //Or any numeric value
}
答案 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);
?>
答案 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。引入了对以下类型的支持:
答案 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.org和http://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 中有效,因为不需要属性类型提示。