<?php
// php 中 trait 的实现
// 看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,
// 其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。
// php5.4开始引入trait,其目的就是在于减少代码的重复,增加代码的复用性。
trait People{
private $runStatus = "1";
function run()
{
echo $this->runStatus . PHP_EOL;
}
}
class Student
{
// trait 的调用方法
use People;
function sutdy()
{
$this->runStatus = 2;
}
}
class Worker
{
// trait 的调用方法
use People;
function work()
{
$this->runStatus = 3;
}
}
// trait 像类一样被创建但是不会 呗声明出来
$s = new Student();
$s->sutdy();
$s->run();
// 输出 2
$w = new Worker();
$w->work();
$w->run();
// 输出 3
// trait 有像类似于像被继承的基类 所有这里就涉及到重点知识
// (敲黑板)从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
// 优先级:自身方法>trait的方法>继承的方法(就是这样子的。)
trait HelloWorld {
public function sayHello()
{
echo 'Hello World!'.PHP_EOL;
}
}
class TheWorldIsNotEnough
{
use HelloWorld;
public function sayHello()
{
echo 'Hello Universe!'.PHP_EOL;
}
}
$o = new TheWorldIsNotEnough();
$o->sayHello();
// 输出是 Hello Universe!
// 多个trait的使用
trait Hello {
public function sayHello()
{
echo 'Hello '.PHP_EOL;
}
}
trait World {
public function sayWorld()
{
echo 'World'.PHP_EOL;
}
}
class MyHelloWorld
{
use Hello, World;
public function sayExclamationMark()
{
echo '!'.PHP_EOL;
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
最后修改:2019 年 08 月 27 日
© 允许规范转载