trait的使用

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);


/**
 * 运算方法1(加法&减法)
 */
trait Operation1
{
    private static string $method1 = 'add & sub';

    public static function add(): int
    {
        // 虽然trait本身并没有声明$num1和$num2,但使用该trait的class声明了$num1和$num2,
        // 那么trait也可以使用,即使这两个属性被声明为private。
        return self::$num1 + self::$num2;

    }

    public static function sub(): int
    {
        return self::$num1 - self::$num2;
    }
}


/**
 * 运算方法2(乘法&除法)
 */
trait Operation2
{
    private static string $method2 = 'mul & div';

    public static function mul(): int
    {
        return self::$num1 * self::$num2;
    }

    public static function div(): float
    {
        return round(self::$num1 / self::$num2, 2);
    }
}


/**
 * 计算器类
 */
class Calculator
{
    private static int $num1 = 0; // 操作数1
    private static int $num2 = 0; // 操作数2

    // 使用Operation1
    use Operation1;

    // 使用Operation2
    use Operation2;

    public static function setNum(int $num1, int $num2): void
    {
        self::$num1 = $num1;
        self::$num2 = $num2;
    }
}


$num1 = 5; // 操作数1
$num2 = 2; // 操作数2
Calculator::setNum($num1, $num2);
echo "$num1 + $num2 = " . Calculator::add() . PHP_EOL; // 5 + 2 = 7
echo "$num1 - $num2 = " . Calculator::sub() . PHP_EOL; // 5 - 2 = 3
echo "$num1 * $num2 = " . Calculator::mul() . PHP_EOL; // 5 * 2 = 10
echo "$num1 / $num2 = " . Calculator::div() . PHP_EOL; // 5 / 2 = 2.5


//========== 总结 ==========//
// 1、trait的定义和class的定义如双胞胎一样相似,它们都可以声明属性和定义方法,但trait不能使用new关键字来实例化,trait只能被class使用。
// 2、一个class里面可以使用多个trait,但需要注意的是被使用的这些trait之间不能有同名属性或同名方法。如果两个trait不被同一个class使用,
//    那么它们就能有同名属性或同名方法。
// 3、trait里定义的方法可以使用class的属性,即使class的属性被声明为private也可以使用。
// 4、class和trait可以有同名方法,并且class将会覆盖trait的方法。

Copyright © 2024 码农人生. All Rights Reserved