由于缺乏对64位VM的访问权限,我目前无法构建hhvm,因此我无法使用他们拥有的类型检查程序.他们的文档似乎没有详细描述类型检查器(hh_server和hh_client?)的操作.
我想知道,对于任何使用过它的人来说,如果在这种情况下可以使用类型检查器:
假设某人无法将他们的PHP代码库转换为Hack,所以他们用hacklang类型注释的形式编写带有注释的PHP,并在构建时使用工具剥离注释,制作一个hh文件,运行typechecker并报告错误.
例如原始PHP:
<?php
function lar(/* int */ $x)/* : int */
{
return $x;
}
Run Code Online (Sandbox Code Playgroud)
复制上面的内容,删除注释,更改?php到?hh:
<?hh
function lar(int $x): int
{
return $x;
}
Run Code Online (Sandbox Code Playgroud)
通过类型检查器运行它,看它是否会产生错误.
这样,您就可以使用普通PHP访问合法类型检查,而无需在HHVM上运行它.typechecker是否以适合此设置的方式运行?
我离开了PHP世界几年,从那时起我就在C#.Net中工作。我正在考虑再次进入PHP,今天我遇到了http://hhvm.com/,它看起来比纯PHP更类似于C#。
所以我的问题是Hack编程语言和PHP有什么区别?
有没有办法告诉HHVM将Hacklang警告和错误输出到浏览器中?像PHP这样的东西启用display_errors,display_startup_errors并error_reporting设置为E_ALL
HHVM版本:
$ php -v
HipHop VM 3.1.0-dev+2014.04.09 (rel)
Compiler: heads/master-0-g4fc811c64c23a3686f66a2bea80ba47f3eaf9f3d
Repo schema: 79197c935790c0b9c9cb13566c3e727ace368117
Run Code Online (Sandbox Code Playgroud)
我尝试过以下配置:
$ cat /etc/hhvm/php.ini
; php options
display_startup_errors = On
error_reporting = E_ALL
display_errors = On
; hhvm specific
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.mysql.typed_results = false
Run Code Online (Sandbox Code Playgroud)
而且:
$ cat /etc/hhvm/server.ini
; php options
pid = /var/run/hhvm/pid
; hhvm specific
hhvm.server.port = 9000
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true …Run Code Online (Sandbox Code Playgroud) 在Hack语言类型系统中,是否存在"顶级"类型,也称为"任何"类型,或通用"对象"类型?也就是说,所有类型都是子类的类型?
该手册提到"混合"类型,可能类似,但没有真正解释.在某些地方也可以简单地省略类型声明.但是,这无法在任何地方完成,例如,如果我想将某个函数声明为函数从string顶部类型,我不知道如何执行此操作.function (string): mixed?
Hack手册非常清楚如何键入 - 注释函数参数,函数返回类型和成员变量.但是,我尝试键入全局变量或函数局部变量的所有方法都会导致语法错误:
string $foo = "foo"; // unexpected T_VARIABLE
$foo : string = "foo"; // unexpected ':'
string $foo; $foo = "foo"; // unexpected T_VARIABLE
$foo : string; $foo = "foo"; // unexpected ':'
Run Code Online (Sandbox Code Playgroud)
这样的注释是否可能?如果有可能,那么正确的语法是什么?如果不可能,那么这是设计还是开发人员计划实施的东西?(这肯定会有用.)
所以我很高兴能够进入一些Hacklang和HHVM,并最终设法让它在CentOS 6 VM上运行(提示:servergrove.com从他们的回购中获得了一个RPM,但它仍然需要MySQL 5.0共享库才能运行 - 仍然是我能找到的最容易的CentOS 6安装虽然......),我想我会解决一个相当小的PHP项目,作为转换为严格的Hack代码的一个很好的测试用例.
我正在通过代码,但我不认为我完全理解hh_client应该如何工作.我在.hhconfig项目的根目录中创建了一个文件,然后hh_client start从目录运行,它似乎开始正常 - 我看到三个hh_server -d /var/www/html/groundwork进程在执行此操作后运行.不过,我想类型检查我的代码每一次,我都跑hh_client check,在那里作为语言的文档和其他来源的使用不断暗示这应该是一个实时的检查器,自动反馈-我会跑watch hh_client check我猜,但似乎我错过了一些东西.
我确保在hack中获得了普通php函数建议的hhi文件的副本
此外,有时当我启动hh_client时,它会报告事后检查不会发生的事情,尽管代码中没有任何改变.检查错误通常较少.再次停止并启动hh_client报告.
谢谢.
如何检查类的实例是否使用 Trait?我无法使用,instanceof因为 Trait 是不可实例化的。
我正在将PHP项目转换为Hack,我遇到了一些障碍.我想要做的是将一个IoC容器从PHP重写为Hack,并且我在通过Hack类型检查工具获取所有内容时遇到了一些麻烦.
基本上我所拥有的是一个容器,它允许您将字符串注册到闭包映射.想法是闭包包含实例化类的逻辑.容器还存储它创建的实例,还允许您强制创建新实例.这是我的容器代码:
<?hh // strict
class Container {
private Map<string, mixed> $instances = Map {};
private Map<string, (function (Container): mixed)> $registered = Map {};
public function register(string $alias, (function (Container): mixed) $closure): void
{
$this->registered[$alias] = $closure;
}
public function get(string $alias): ?mixed
{
if (!$this->registered->contains($alias)) {
return null;
}
$instance = $this->instances->get($alias);
if ($instance !== null) {
return $instance;
}
$closure = $this->registered->get($alias);
if ($closure !== null) {
$this->instances->set($alias, $closure($this));
}
return $this->instances->get($alias);
}
public function getNew(string $alias): ?mixed …Run Code Online (Sandbox Code Playgroud) 我有一个形状
type foo = shape(
?'bar' => float,
...
);
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试bar通过以下方式访问字段的值,
do_something_with($rcvd['bar']);
Run Code Online (Sandbox Code Playgroud)
$ rcvd是foo类型的地方,它不起作用(很明显)
如何访问形状的可选成员?