php实现多继承-trait语法

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

以下为代码:

trait traitTestOne{
	public function test(){
		echo "This is trait one <br/>";
	}
	public function testOne(){
		echo "one <br/>";
	}
}

trait traitTestTwo{
// 	public function test(){
// 		echo "This is trait two";
// 	}
	public function testTwo(){
		echo "two <br/>";
	}
}

class basicTest{
	public function test(){
		echo "hello world\n";
	}
}
class myCode extends basicTest{
	use traitTestOne,traitTestTwo;
}

$test = new mycode();
$test->test();
$test->testOne();
$test->testTwo();

  输出为:

This is trait one
one
two

  注意。如果把注释一行的注释取消,将会报错

Fatal error: Trait method test has not been applied, because there are collisions with other trait methods on myCode in ......test.php on line 28

是致命错误。

时间: 2025-01-03 14:06:55

php实现多继承-trait语法的相关文章

PHP5.4以上更新的伪&quot;多继承&quot;--trait语法

在PHP低版本中,类是无法实现多继承的,因而,我们在想要达到多继承效果时就要考虑到"链式继承",在高版本PHP中更新了trait语法,以实现"所谓的多继承" <?php trait PHP { public function pcode() { echo '我可以编写PHP代码'; } } ? trait Java { public function jcode() { echo '我可以编写JAVA代码'; } } class Stu { use PHP ,

原型继承的语法格式

最规范的语法:   function 子类(){ 父类.call(this); }   var F = function(){}; F.prototype = 父类.prototype; //让F的原型指向父类的原型 子类.prototype = new F(); 子类.protype.constructor = 子类的构造函数

java的继承、接口方面的语法及知识

继承(inheritance):一个类只能继承一个类代码复用继承的语法:class ChildClass extends ParentsClass{ }父类的属性子类中都存在,只是有没有权限访问的问题根据名字找谁是谁?1.变量-> 类型 (类.接口)->接口2.已经确定是变量局部变量.形参->类的属性-> 外部类的属性就近原则构造方法:注意默认的那个无参构造方法 优先调用父类的构造方法如果没有明确指出,java会插入一条调用父类的构造方法(无参的)利用super关键字:1.调用父类

快学Scala 第二十一课 (初始化trait的抽象字段)

初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println("Logged")} } trait FileLogger extends Logged { var filename: String override def log(msg: String) { println("filename:" + filename) } }

day23 组合(补充)和 继承

一.组合 #组合 #人 类 -- 武器类 #狗 类 #继承 #组合表现的是:谁有什么的关系 #人有武器 #学校有学生 #学生有课程 #circle from math import pi class Circle: def __init__(self,radius): self.radius = radius def perimeter(self): return 2 * pi * self.radius def area(self): return pi * self.radius **2 #

Objective-C的封装、继承与多态

面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐藏对象的实现细节,不让用户看到,以此来增强安全性和简化编程,进而达到封装的目的. 使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员. 访问修饰符:private.protect.public private:私有的,不可供外部访问的信息,只有类本身能存取. prot

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

面向对象_继承

一.继承的基本概念: 1.继承是面向对象的三大特性之一  2.被继承的类称为父类(超类),继承父类的类称为子类(派生类)  3.继承是指一个对象直接使用另一个对象的属性和方法(继承之后才能使用) 4.通过继承可以实现代码重用 二.使用继承的要求 1.将每个类的共性提取出来单独放在一个类中来描述 2.然后让这个类与其他每个类之间有点关系这样就可以了 3.注意:千万不要为了获取其他类的功能,简化代码而继承 4.必须是类与类之间有所属关系才可以继承 5.例如:将学生和工人的共性(共同属性,共同方法)描

c++之继承三

多继承“  一个类有多个直接基类的继承关系称为多继承 多继承声明语法 class  派生类名 : 访问控制  基类名1 ,  访问控制  基类名2 ,  … , 访问控制  基类名n { 数据成员和成员函数声明 }: 多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员. 执行顺序与单继承构造函数情况类似.多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序.  一个派生类对象拥有多个直接或间接基类的成员.不同名成员访问不会出现二义性.如果不同的基类有同名成员,派