《Hack与HHVM权威指南》——1.4.3 调用PHP代码

本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第1章,第1.4.3节,作者 Owen Yamauchi,更多章节内容可以访问“华章计算机”公众号查看。

1.4.3 调用PHP代码

如果你使用了一个类型检查器无法在任何Hack文件中找到的命名实体,在局部和耦合模式下并不会引发错误(在严格模式下,这将会触发一个“unbound error”)。这看起来似乎是个很奇怪的宽松的行为,但是真正的目的在于Hack代码从PHP迁移的易用性。这允许Hack文件中的代码使用PHP文件中的代码:调用函数、使用常量,甚至实例化和扩展类。记住,类型检查器不会对你的PHP文件做任何分析,甚至都不会去分析你的PHP文件里面定义了什么函数,这些都是需要你自己负责的。
在局部模式下,对于上述情况你还可以通过配置项主动触发一个错误。这个选项称为“assume_php”(就是“假设丢失的实体都定义在PHP里面”的意思),这个选项默认是开启的。你可以通过在.hhconfig文件中添加一行代码“assume_php=false”来关闭它。然后通过命令行“hh_client restart”重启类型检查器的服务端。
如果你准备迁移一个大的PHP代码库到Hack,保持assume_php选项开启是个非常好的注意。在后续的阶段中,随着代码库里面更多的PHP文件转变为Hack文件,那么关闭assume_php选项是更好的选择,可以更好地享受严格模式带来的好处。当然了,如果你刚刚开始一个全新的Hack项目的代码编写工作,最好在最开始的时候关闭这个选项(设置assume_php=false)。
对于未知的函数或者类的使用,类型检查器设定了最大的宽容性假设:
对未知函数的调用,类型检查时认为它能够接纳任何数量、任何类型的参数值,并且没有返回类型标注。
未知的常量定义被认为是特殊的“任何”类型——就像它们在调用一个没有任何返回类型标注的函数结果。
实例化一个未知类型的类,得到的结果值是个对象。调用这个对象上面的任何方法都是合法的,类型检查上就像调用一个未知的函数。任何对这个对象的属性访问也是合法的,并且返回的值将具有特殊的“任何”类型。
一个Hack类如果具有任何未知的祖先类,或者使用了任何未知的特性,或者其任何祖先类有未知的特性,这都和一个未知的类差不多。未知的特性或者类会大大削弱整个实体结构中的类型检查器。调用上述类中的任何方法或者访问任何未知属性都是合法的。
然而,对于定义在Hack文件中的方法调用或者属性访问,如果类型检查器能够解决的话,即使在耦合模式下,它也会对其进行适当的类型检查。例如:

class C extends SomeClassNotDefinedInHack {
  public int $known_property;
  public function known_method(string $s) {
    // ...
  }
}
function main(): void {
  $c = new C();
  $c->unknown_method(); //  没有错误
  $c->known_method(12); //  错误 : int类型并不兼容 string类型
  $c->unknown_property->func(); //  没有错误
  $c->known_property->func();   //  错误 : 不能在一个int类型上调用方法
时间: 2024-08-22 17:49:06

《Hack与HHVM权威指南》——1.4.3 调用PHP代码的相关文章

《Hack与HHVM权威指南》——第1章 类型检查

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 第1章 类型检查 类型检查器是Hack语言的标志特性,它对Hack程序静态地进行分析(不用运行它们),并且能够检查很多种错误.这就能够在程序开发初期尽量避免bug,并且使程序更容易阅读和理解.为了增强类型检查器的能力,Hack语言允许编程人员显式地在程序体中标注某些变量值的类型,比如函数参数.函数返回值和属性值,类型检

《Hack与HHVM权威指南》——1.7.1 提炼nullable类型到non-nullable类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7.1 提炼nullable类型到non-nullable类型 null检查语句在从空值(nullable)的类型到非空值(non-nullable)类型的转变中经常用到.下面是个通过了类型检查器检查的示例. function takes_string(string $str) { // ... } functio

《Hack与HHVM权威指南》——1.5.1 使用超级全局变量

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.1 使用超级全局变量 超级全局变量是在每个代码范围内都存在的全局变量,不需要使用global语句即可使用.这些在运行环境中特殊存在的变量一共有9个,分别是: $GLOBALS $_SERVER $_GET $_POST $_FILES $_COOKIE $_SESSION $_REQUEST $_ENV

《Hack与HHVM权威指南》——1.5.3 属性值初始化

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.3节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.3 属性值初始化 为了维护类型安全,类型标注过的属性在初始化时,无论是严格模式还是局部模式,类型检查器会强加一些规则.首要目标就是确保属性值在没有初始化为正确类型的值之前,不能被读取. 对于静态的属性值,规则非常简单:任何不可为空的(non-nullable)的静态属性值都必须有一个初始化值.没有显式初

《Hack与HHVM权威指南》——1.4 Hack的类型系统

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.4节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.4 Hack的类型系统 Hack提供了一系列强有力的方法来描述类型,在PHP最基本的布尔型.整型.字符串型.数组等类型系统的基础上,添加了很多新的方式来结合它们,并且使之更富有表现力. 原始类型 这里有和PHP一样的原始类型:bool.int.float.string.array和resource,这些都是合法

《Hack与HHVM权威指南》——第1章 类型检查1.7 类型提炼

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.7节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7 类型提炼 假设你有个?string类型的值,而且准备把这个值传递给一个参数类型为string的函数.那么你怎么把一个类型(?string)转化为另外一个类型(string)呢?或者假设你有个object类型的值,它可能实现或没有实现Polarizable接口.同时,如果它实现了这个接口,你还希望调用这个ob

《Hack与HHVM权威指南》——第2章 泛型2.1 入门实例

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第2章,第2.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 第2章 泛型 泛型在Hack的类型系统里面是个非常强大的特性,泛型可以允许你在不知道流程中传入的具体类型的情况下,写出类型安全的代码.一个类或者函数都可以是泛型的,这意味着它可以让调用者来选择传入的参数类型. 泛型结构体最好的例子就是数组和集合类(关于集合类的更多内容请参见第5章).不具备明确指出数组内容具体类型的

《Hack与HHVM权威指南》——1.2.1 自动加载一切

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.2.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.2.1 自动加载一切 类型检查器做出的一个关键假设就是,你的项目经过设置后,代码库中的任何类.函数或者常量都能够在你代码库的其他地方使用.不会尝试去分析任何include或者require语句,确保当前文件在使用时已经加载了其他文件.相反,它认为你已经完成了"自动加载"的相关设置.这就简

《Hack与HHVM权威指南》——1.4.1 类型检查器模式

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.4.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.4.1 类型检查器模式 Hack的类型检查器有三种模式:严格(strict).局部(partial)和耦合(decl).这些模式都基于一个个单独的文件,不同模式下的单独文件可以无缝地进行对接.每个文件可以单独声明它的类型检查模式,语法就是在文件的第一行使用一个双斜线的注释.如下面的代码所示:<?hh

《Hack与HHVM权威指南》——1.5.6 在switch语句中的越界

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.6节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.6 在switch语句中的越界 在switch语句中有从一个分支不小心越界到另外一个分支的常见错误.Hack添加了一条规则来捕获这种错误.下面将展示一个案例,从一个case分支越界到另外一个分支将会引发一个错误,除非第一个分支是空的: switch ($day) { case 'sun': echo '