ZetCode

PHP Trait

最后修改:2025 年 2 月 15 日

在本文中,我们将展示如何在 PHP 中使用 traits。Traits 是 PHP 中代码复用的一种机制,允许开发者在不使用继承的情况下,将方法包含在多个类中。Traits 对于在不相关的类之间共享功能特别有用。

PHP Traits 的主要特性

Traits 使用 trait 关键字声明,并可以使用 use 关键字包含在类中。

Traits 的基本用法

以下示例演示了如何在 PHP 中定义和使用 trait。

main.php
<?php

trait Hello
{
    public function sayHello()
    {
        echo "Hello!";
    }
}

class Greeting
{
    use Hello;
}

$greeting = new Greeting();
$greeting->sayHello();

在这个程序中,Hello trait 定义了一个 sayHello 方法。Greeting 类使用 use 关键字包含 Hello trait,并调用 sayHello 方法。

$ php main.php
Hello!

多个 Trait

以下示例演示了如何在单个类中使用多个 traits。

main.php
<?php

trait Hello
{
    public function sayHello()
    {
        echo "Hello!\n";
    }
}

trait Today
{
    public function showToday()
    {
        echo date("Y-m-d H:i:s\n");
    }
}

class Greeting
{
    use Hello;
    use Today;
}

$greeting = new Greeting();
$greeting->sayHello();
$greeting-> showToday();

在这个程序中,Greeting 类同时包含了 HelloToday traits。然后它调用来自这两个 traits 的方法。

$ php main.php
Hello!
2025-02-17 11:27:35

冲突解决

以下示例演示了当两个 traits 具有同名方法时如何解决冲突。

main.php
<?php

trait Loggable {
    public function log($message) {
        echo "Loggable: $message\n";
    }
}

trait Notifiable {
    public function log($message) {
        echo "Notifiable: $message\n";
    }
}

class User {
    use Loggable, Notifiable {
        Loggable::log insteadof Notifiable; 
        Notifiable::log as notify;
    }

    public function create() {
        $this->log("User created.");
        $this->notify("Welcome, new user!");
    }
}

$user = new User();
$user->create();

在这个程序中,User 类包含了 LoggableNotifiable traits,它们具有冲突的 log 方法。冲突使用 insteadofas 关键字解决。

$ php main.php
Loggable: User created.
Notifiable: Welcome, new user!

带有属性的 Traits

以下示例演示了如何在 traits 中定义和使用属性。

main.php
<?php

trait Loggable {
    protected $logFile = "log.txt";

    public function log($message) {
        file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
    }
}

class User {
    use Loggable;

    public function create() {
        $this->log("User created.");
    }
}

$user = new User();
$user->create();

在这个程序中,Loggable trait 定义了一个 $logFile 属性和一个 log 方法。User 类包含了 Loggable trait,并使用 log 方法写入日志文件。

在下面的程序中,我们有两个 traits:HelloMessageColorMessage

main.php
<?php

trait HelloMessage
{
    public function hello(): void
    {
        echo "Hello there!\n";
    }
}


trait ColorMessage
{
    public function showColorMessage($message, $color = 'default'): void
    {
        $colors = [
            'default' => "\033[0m",    // Default color
            'red' => "\033[31m",      // Red
            'green' => "\033[32m",    // Green
            'yellow' => "\033[33m",   // Yellow
            'blue' => "\033[34m",     // Blue
        ];

        $colorCode = $colors[$color] ?? $colors['default'];
        echo $colorCode . $message . "\n" . "\033[m";
    }
}

class Info
{
    use HelloMessage;
    use ColorMessage;
}

$info = new Info();

$info->hello();

$info->showColorMessage('Hello there!');
$info->showColorMessage('Hello there!', 'green');
$info->showColorMessage('Hello there!', 'blue');

HelloMessage 打印一个简单的问候消息,而 ColorMessage 接受一个消息参数并以彩色打印它。

public function showColorMessage($message, $color = 'default'): void
{
    $colors = [
        'default' => "\033[0m",    // Default color
        'red' => "\033[31m",      // Red
        'green' => "\033[32m",    // Green
        'yellow' => "\033[33m",   // Yellow
        'blue' => "\033[34m",     // Blue
    ];

    $colorCode = $colors[$color] ?? $colors['default'];
    echo $colorCode . $message . "\n" . "\033[m";
}

我们可以从给定的颜色名称中选择,或者选择一个默认的颜色。

class Info
{
    use HelloMessage;
    use ColorMessage;
}

Hello 类使用这两个 traits,因此它可以调用 helloshowColorMessage 方法。

来源

PHP Traits - 文档

在本文中,我们展示了如何在 PHP 中使用 traits 进行代码复用。Traits 是一种强大的工具,用于在不使用继承的情况下,在不相关的类之间共享功能。

作者

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

列出 所有 PHP 教程