ZetCode

PHP mixed 关键字

最后修改于 2025 年 4 月 16 日

PHP 的 mixed 关键字是一种伪类型,表明一个参数或返回值可以接受多种不同的类型。它是在 PHP 8.0 中作为类型系统改进的一部分引入的。mixed 类型等同于根本没有任何类型声明。

基本定义

mixed 类型意味着一个值可以是任何 PHP 类型:array, bool, callable, int, float, null, object, resource, string。它明确地表明该值可以是任何类型。这对于处理各种输入类型的函数很有用。

与联合类型不同,mixed 不需要列出所有可能的类型。它是一个包含所有可能类型的全包类型。当用作返回类型时,它表明函数可以返回任何类型的值。

语法:function example(mixed $param): mixed {}。mixed 类型可用于参数、返回类型和属性 (PHP 8.0+)。

基本 mixed 参数

此示例展示了一个接受 mixed 参数并对其进行处理的函数。

basic_mixed.php
<?php

declare(strict_types=1);

function processValue(mixed $value): void {
    if (is_int($value)) {
        echo "Integer: " . ($value * 2);
    } elseif (is_string($value)) {
        echo "String: " . strtoupper($value);
    } else {
        echo "Other type: " . gettype($value);
    }
}

processValue(10);      // Integer: 20
processValue("hello"); // String: HELLO
processValue(true);    // Other type: boolean

processValue 函数接受任何类型的参数。在内部,我们检查类型并进行相应的处理。这种模式在使用 mixed 类型时很常见。像 is_int 这样的类型检查函数是必不可少的。

Mixed 返回类型

此示例演示了一个可以返回不同类型值的函数。

mixed_return.php
<?php

declare(strict_types=1);

function getConfigValue(string $key): mixed {
    $config = [
        'timeout' => 30,
        'debug' => true,
        'name' => 'App'
    ];

    return $config[$key] ?? null;
}

$timeout = getConfigValue('timeout'); // int(30)
$debug = getConfigValue('debug');    // bool(true)
$name = getConfigValue('name');      // string(3) "App"

getConfigValue 函数根据配置键返回不同的类型。mixed 返回类型准确地记录了这种行为。如果没有 mixed,我们需要一个联合类型或没有返回类型声明。这比使用 ? 进行可空返回更简洁。

Mixed 与类型检查

此示例展示了在使用 mixed 值时进行适当的类型检查。

type_checking.php
<?php

declare(strict_types=1);

function calculate(mixed $a, mixed $b): float {
    if (!is_numeric($a) || !is_numeric($b)) {
        throw new InvalidArgumentException('Non-numeric value provided');
    }

    return (float)$a + (float)$b;
}

echo calculate(10, 5.5);    // 15.5
echo calculate("3", "2.5"); // 5.5
// calculate("foo", 5);    // Throws exception

该函数接受 mixed 参数,但要求它们是数字。我们使用 is_numeric 在计算之前验证这一点。这演示了使用 mixed 类型的防御性编程。尽管接受任何输入类型,但该函数仍然保持了清晰的期望。

Mixed 在类属性中

此示例展示了在 PHP 8.0+ 中将 mixed 类型用于类属性。

mixed_property.php
<?php

declare(strict_types=1);

class UserSettings {
    public mixed $theme = 'light';
    public mixed $lastLogin;
    
    public function setPreference(mixed $value): void {
        $this->theme = $value;
    }
    
    public function getTheme(): mixed {
        return $this->theme;
    }
}

$settings = new UserSettings();
$settings->setPreference('dark');
$settings->lastLogin = new DateTime();

var_dump($settings->getTheme());    // string(4) "dark"
var_dump($settings->lastLogin);     // DateTime object

该类将 mixed 类型用于属性和方法。这允许灵活地存储不同的值类型。$theme 属性开始时是字符串,但可以更改类型。应该谨慎使用 mixed 属性以保持代码清晰度。

Mixed 与数组函数

此示例演示了在数组操作中处理 mixed 值。

array_functions.php
<?php

declare(strict_types=1);

function processArray(array $data): array {
    return array_map(function(mixed $item): mixed {
        if (is_string($item)) {
            return trim($item);
        } elseif (is_int($item)) {
            return $item * 2;
        }
        return $item;
    }, $data);
}

$result = processArray([10, " hello ", true, 3.5]);
// [20, "hello", true, 3.5]

processArray 函数根据每个元素的类型应用不同的转换。回调函数使用 mixed 作为其参数和返回类型。这种模式在处理异构数组时很常见。除非进行转换,否则每个数组元素都会保留其原始类型。

Mixed 在联合类型中

此示例展示了 mixed 如何与其他类型在联合类型中交互。

union_types.php
<?php

declare(strict_types=1);

function example(string|mixed $param): void {
    // mixed includes string, so this is redundant
    echo $param;
}

function betterExample(mixed $param): void {
    if ($param instanceof DateTimeInterface) {
        echo $param->format('Y-m-d');
    } else {
        echo $param;
    }
}

example("test");       // works
betterExample(new DateTime()); // outputs current date

第一个函数显示了 mixed 与其他类型的冗余混合。由于 mixed 包含了所有类型,因此使用 mixed 的联合类型是不必要的。第二个函数演示了使用类型检查正确使用 mixed。当在 mixed 参数中使用对象时,Instanceof 检查很有用。

Mixed 与 null

此示例探讨了 mixed 和 null 值之间的关系。

mixed_null.php
<?php

declare(strict_types=1);

function handleNull(mixed $input): string {
    if ($input === null) {
        return 'NULL value';
    }
    
    return gettype($input) . ': ' . (string)$input;
}

echo handleNull(null);         // NULL value
echo handleNull(42);          // integer: 42
echo handleNull("text");      // string: text
echo handleNull(false);       // boolean: 

该函数表明 null 是一个有效的 mixed 值。我们明确地检查 null 以对其进行不同的处理。Mixed 包含了 null 以及所有其他类型。这与某些语言有所不同,在这些语言中,null 可能是单独的。该函数将非 null 值转换为字符串以获得一致的输出。

最佳实践

来源

PHP mixed 文档

本教程介绍了 PHP 的 mixed 类型,并附有实际示例,展示了它在参数、返回值、属性等中的用法。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程