PHP类型声明与继承机制详解
发布时间: 2025-08-13 02:25:37 阅读量: 1 订阅数: 6 

### PHP 类型声明与继承机制详解
在 PHP 编程中,类型声明和继承机制是非常重要的概念,它们能够帮助开发者编写更健壮、更易于维护的代码。下面我们将详细探讨 PHP 中的类型声明和继承机制。
#### 1. 基本类型声明
在 PHP 7 发布之前,只能对对象和少数其他类型(如可调用类型和数组)进行约束。PHP 7 引入了标量类型声明,允许在参数列表中强制使用布尔型、字符串型、整型和浮点型。
以下是一个示例,展示了如何在 `ShopProduct` 类的构造函数中使用标量类型声明:
```php
class ShopProduct
{
public $title;
public $producerMainName;
public $producerFirstName;
public $price = 0;
public function __construct(
string $title,
string $firstName,
string $mainName,
float $price
) {
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
}
// ...
}
```
这样,我们可以确保 `$title`、`$firstName` 和 `$mainName` 始终包含字符串数据,而 `$price` 包含浮点型数据。如果尝试使用错误的信息实例化 `ShopProduct` 对象,PHP 会抛出类型错误:
```php
// 会失败
$product = new ShopProduct("title", "first", "main", []);
```
默认情况下,PHP 会在可能的情况下隐式地将参数转换为所需的类型。例如:
```php
$product = new ShopProduct("title", "first", "main", "4.22");
```
这里,字符串 `"4.22"` 会被隐式转换为浮点型 `4.22`。但这种隐式转换也可能带来问题,比如在 `AddressManager` 类中,字符串 `"false"` 可能会被解析为布尔型 `true`。
可以通过 `declare(strict_types=1)` 来开启严格类型声明,这样可以避免隐式转换带来的问题:
```php
declare(strict_types=1);
$manager->outputAddresses("false");
```
此时,由于开启了严格类型声明,上述代码会抛出类型错误。
另外,如果需要使某个参数可选,但在提供时仍要约束其类型,可以通过提供默认值来实现:
```php
class ConfReader
{
public function getValues(array $default = [])
{
$values = [];
// 做一些获取值的操作
// 合并提供的默认值(它始终是一个数组)
$values = array_merge($default, $values);
return $values;
}
}
```
#### 2. 混合类型声明
PHP 8.0 引入了混合类型声明 `mixed`,它本身并没有太多实际功能。以下两个示例在功能上是相同的:
```php
class Storage
{
public function add(string $key, $value)
{
// 对 $key 和 $value 做一些操作
}
}
class Storage
{
public function add(string $key, mixed $value)
{
// 对 $key 和 $value 做一些操作
}
}
```
声明 `mixed` 类型的参数意味着该参数有意接受任何值,这消除了代码中可能存在的疑问和不确定性,因此是有用的。
#### 3. 联合类型声明
在 PHP 8 之前,如果需要将参数约束为两个、三个或更多指定类型,只能在方法体中进行类型检查。PHP 8 引入了联合类型声明,允许使用管道符号 `|` 组合两个或更多类型。
例如,`Storage` 类的 `add()` 方法只接受字符串或布尔值作为 `$value` 参数:
```php
class Storage
{
public function add(string $key, string|bool $value)
{
// 对 $key 和 $value 做一些操作
}
}
```
如果需要允许 `null` 值,可以这样声明:
```php
class Storage
{
public function add(string $key, string|bool|null $value)
{
// 对 $key 和 $value 做一些操作
}
}
```
联合类型声明也适用于对象类型声明,例如:
```php
public function setShopProduct(ShopProduct|null $product)
{
// 对 $product 做一些操作
}
```
PHP 8 还支持在联合类型中使用 `false` 伪类型,例如:
```php
public function setShopProduct2(ShopProduct|false $product)
{
// 对 $product 做一些操作
}
```
#### 4. 可空类型声明
可空类型声明由类型声明前加一个问号组成,它是联合类型接受 `null` 作为其中一个选项的等效写法。例如:
```php
class Storage
{
public function add(string $key, ?string $value)
{
// 对 $key 和 $value 做一些操作
}
}
```
#### 5. 返回类型声明
和声明参数类型一样,也可以使用返回类型声明来约束方法的返回类型。返回类型声明直接放在方法或函数的右括号后面,形式为冒号后跟类型。支持的返回类型和参数类型相同。
以下是一个约束返回类型为整型的示例:
```php
public function getPlayLength(): int
{
return $this->playLength;
}
```
如果该方法在调用时未能返回整型值,PHP 会生成错误。
返回类型声明也支持可空类型和联合类型,例如:
```php
public function getPrice(): int|float
{
return ($this->price - $this->discount);
}
```
PHP 8 还支持使用 `void` 伪类型声明方法永远不返回值:
```php
public function setDiscount(int|float $num): void
{
$this->discount = $num;
}
```
#### 6. 类型声明总结
PHP 支持的类型声明如下表所示:
| 类型声明 | 引入版本 | 描述 |
| --- | --- | --- |
| array | 5.1 | 数组。可以默认值为 `null` 或数组 |
| int | 7.0 | 整数。可以默认值为 `null` 或整数 |
| float | 7.0 | 浮点数(带小数点的数字)。即使在严格模式下,整数也会被接受。可以默认值为 `null`、浮点数或整数 |
| callable | 5.4 | 可调用代码(如匿名函数)。可以默认值为 `null` |
| bool | 7.0 | 布尔值。可以默认值为 `null` 或布尔值 |
| string | 5.0 | 字符数据。可以默认值为 `null` 或字符串 |
| self | 5.0 | 对包含类的引用 |
| [类类型] | 5.0 | 类或接口的类型。可以默认值为 `null` |
| iterable | 7.1 | 可以使用 `foreach` 遍历(不一定是数组,可能
0
0
相关推荐









