《Hack与HHVM权威指南》——1.5.2 覆盖方法的类型

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

1.5.2 覆盖方法的类型

在Hack的代码之间,继承是更加复杂的相互关系中的一种。这复杂性主要来自于当继承关系被创建时,继承和被继承的代码之间的分离现象。举例来说,如果你有个类型标注为SomeClass的对象并可以调用这个对象的某个方法,那么你可以调用继承自SomeClass的任何类的某个方法。这个调用仍然需要是类型安全的,这就意味着覆盖其他方法的时候,方法的类型必须有一定的规则。
在一个覆盖方法中,参数类型必须和被覆盖的方法类型完全一致。这主要是因为继承自PHP的一个行为。在PHP中,任何覆盖自抽象方法或者接口中声明的覆盖方法,都必须精确地匹配被覆盖方法的参数类型。这在未来Hack版本中的声明可能会有所改变,允许改变方法的参数类型将是更通常的做法。
换句话说,当进行方法覆盖时,覆盖方法的返回类型并不一定保持相同,相对于被覆盖的方法而言,覆盖方法可以有一个更加明确的返回类型。例如:

class ParentClass {
  public function generate(): num {
    // ...
  }
}
class ChildClass extends ParentClass {
  public function generate(): int {  // OK
    // ...
  }
}

虽然改变了返回类型,这种多态的调用仍然是类型安全的。
function f(ParentClass $obj) {
$number = $obj->generate();
// 即使$obj是个ChildClass实例,generate()方法自然会返回num类型
// 因为ChildClass::generate() 返回的是int类型,而所有int类型都属于num类型
用更通常的返回类型进行覆盖是非法的。例如,如果ChildClass的generate()方法被声明成返回类型为mixed的话,类型检查器将会报告错误。

时间: 2024-09-20 20:25:14

《Hack与HHVM权威指南》——1.5.2 覆盖方法的类型的相关文章

《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.6.2 未决的类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.6.2节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.6.2 未决的类型 事实上,如果一个变量没有类型定义的话,那就意味着类型检查器需要一个途径来处理下例中的代码: if (some_condition()) { $x = 10; } else { $x = 'ten'; } 这种模式在PHP中是比较常见的,所以它在Hack中也是合法的.然后问题来了:在这个情

《Hack与HHVM权威指南》——1.5.4 可变参数类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.4 可变参数类型 正如我们早期看到的一样,Hack拥有声明某个函数是可变参数的语法: function log_error(string $format, ...) { $args = func_get_args(); // ... } PHP 5.6介绍了一个不同的可变参数的语法,它有两个特性超过了Hack.

《Hack与HHVM权威指南》——1.5.5 迭代生成器类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.5节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.5 迭代生成器类型 对迭代生成器添加一个返回类型标注,这里有三种接口类型可以使用,它们分别是: Iterator.KeyedIterator和Generator.这三种类型都是通用的.在开始介绍第2章的内容之前,我们不会一一赘述,这里仅仅做一些简单的介绍.当你不期待迭代在生成器上调用send()方法时,

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

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

《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章).不具备明确指出数组内容具体类型的