<?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