1.6 高级用法

1.6 高级用法 #

组合优于继承 #

在一些情况下,组合(Composition)可以比继承更为灵活和可维护。你可以通过在类中包含另一个类(作为属性)来实现功能复用,而不是通过继承。这种方式减少了类之间的耦合度。

class A {
    public function methodA() {
        echo "Method A";
    }
}

class B {
    public function methodB() {
        echo "Method B";
    }
}

class C {
    private $a;
    private $b;

    public function __construct() {
        $this->a = new A();
        $this->b = new B();
    }

    public function methodA() {
        $this->a->methodA();
    }

    public function methodB() {
        $this->b->methodB();
    }
}

$c = new C();
$c->methodA();
$c->methodB();

trait 方法冲突 #

当多个 Trait 的方法名相同时,可以使用 insteadof 和 as 关键字来解决冲突。

trait Logger {
    public function log($message) {
        echo "Log: " . $message;
    }
}

trait FileLogger {
    public function log($message) {
        echo "FileLog: " . $message;
    }
}

class User {
    use Logger, FileLogger {
        Logger::log insteadof FileLogger; // 使用 Logger 的 log 方法
        FileLogger::log as fileLog; // 为 FileLogger 的 log 方法起个别名
    }
}

$user = new User();
$user->log("Test"); // 输出 "Log: Test"
$user->fileLog("Test"); // 输出 "FileLog: Test"