PHP Trait 解决 PHP 单继承问题
什么是继承?
继承实际上是存在于面向对象程序设计中的两个类之间的一种关系,是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,充分利用已有的类来完成更复杂、更深入的开发。
当一个类拥有另一个类的所有数据和操作时,就称这两个类之间具有继承关系。
被继承的类称为父类,继承了父类的所有数据和操作的类称为子类。
在 PHP 中用 extends 表明子类与父类的继承关系。
在面向对象的程序设计中,采用继承的方式来组织设计系统中的类,可以提高程序的抽象程度,更接近人的思维方式,使程序结构更清晰并降低编码和维护的工作量。
- 单继承是指任何一个类都只有一个单一的父类,其结构可以用单纯的树状结构来表示;
- 多继承是指一个类可以有一个以上的父类,它的静态的数据属性和操作从所有这些父类中继承,其结构应以复杂的网状结构来表示。
PHP 仅支持单继承,而多继承是通过接口或者 Trait 来实现的。
PHP 的单继承示例:
// 单继承:一个子类只能有一个父类
class A{
function show() {
echo "A";
}
} class B{
function show() {
echo "B";
}
} class C extends A{ } $c = new C;
$c->show();
使用 Trait 解决 PHP 的单继承
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
- Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制
- Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method
- Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题
- 无法通过 trait 自身来实例化
示例:
<?php
trait Reader{
public function add($var1,$var2){
return $var1+$var2;
}
}
trait writer {
public function multiplication($var1,$var2){
return $var1*$var2;
}
}
class File {
use Reader;
use writer;
public function calculate($var1,$var2){
echo "Ressult of addition:".$this->add($var1,$var2) ."\n";
echo "Ressult of multiplication:".$this->multiplication($var1,$var2);
}
}
$o = new File();
$o->calculate(5,3);
多个 trait
通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
} trait World {
public function sayWorld() {
echo 'World';
}
} class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
} $o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
冲突的解决
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。
示例:
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
} trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
} class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
} class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
从 trait 来组成 trait
正如 class 能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 trait,能够组合其它 trait 中的部分或全部成员。
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
} trait World {
public function sayWorld() {
echo 'World!';
}
} trait HelloWorld {
use Hello, World;
} class MyHelloWorld {
use HelloWorld;
} $o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
Trait 的抽象成员
为了对使用的类施加强制要求,trait 支持抽象方法的使用。
<?php
trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
abstract public function getWorld();
} class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
Trait 的静态成员
Traits 可以被静态成员静态方法定义。
<?php
// 静态成员
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
} class C1 {
use Counter;
} class C2 {
use Counter;
} $o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
<?php
// 静态方法
trait StaticExample {
public static function doSomething() {
return 'Doing something';
}
} class Example {
use StaticExample;
} Example::doSomething();
<?php
// 定义属性
trait PropertiesTrait {
public $x = 1;
} class PropertiesExample {
use PropertiesTrait;
} $example = new PropertiesExample;
$example->x;
参考:
https://www.php.net/manual/zh/language.oop5.traits.php
https://learnku.com/php/t/37694
https://www.tutorialspoint.com/what-is-traits-in-php
原文地址:
https://www.ryanzoe.top/php/%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1/php-trait/
PHP Trait 解决 PHP 单继承问题的更多相关文章
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
- maven中import scope依赖方式解决单继承问题的理解
在maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖) <d ...
- C++对象模型:单继承,多继承,虚继承
什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分.对于各种支持的底层实现机制. 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 clas ...
- C++中的类继承(4)继承种类之单继承&多继承&菱形继承
单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...
- C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
- C++中的类继承之单继承&多继承&菱形继承
C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或 ...
- c++继承汇总(单继承、多继承、虚继承、菱形继承)
多重继承中,一个基类可以在派生层次中出现多次,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多分同名成员.C++提供虚基类的方法使得在 ...
- ~~核心编程(四):面向对象——单继承&复写~~
进击のpython 继承 继承的出现!就是一个作用! 为了节省代码! 为什么说节省代码? 你爸爸要是王健林 你是不是就不用愁怎么获得钱了? 为啥? 是不是钱已经有了! 直接拿来用就行了! 我们想一下奥 ...
- C++对象模型:单继承,多继承,虚继承,菱形虚继承,及其内存布局图
C++目前使用的对象模型: 此模型下,nonstatic数据成员被置于每一个类的对象中,而static数据成员则被置于类对象之外,static和nonstatic函数也都放在类对象之外(通过函数指针指 ...
- python面向编程:类继承、继承案例、单继承下属性查找、super方法
一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...
随机推荐
- 【深度评测】Joomla Auto Readmore插件:自动提取缩略图+智能摘要,双引擎驱动内容效率革命
"文章缩略图与摘要分离管理.重复上传图片.移动端封面图比例失调--"这些Joomla站长的经典痛点,如今被Auto Readmore插件的全自动缩略图提取功能彻底终结.本文将深度解 ...
- FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍
title: FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍 date: 2025/06/07 08:40:35 updated: 2025/06/07 08:40:35 author: ...
- GHCTF 2025 web 萌新初探wp
ctf萌新第一次写wp,如有错误请师傅们指出 [GHCTF 2025]SQL??? 打开靶机是一个用户查询的页面,结合题目名称猜测是sql注入,但是常规方法都试过了没办法注入,当时也是很懵逼,后来一个 ...
- 3. LangChain4j-RAG,实现简单的text-sql功能
1. 简介 前两章我们讲了如何使用LangChain4J进行AI交互, 其中包括 使用ChatLanguageModel.ChatMessage.ChatMemory等底层组件进行灵活/自由的与AI交 ...
- EasyMR 安全架构揭秘:如何管理 Hadoop 数据安全
2017年,美国信用评级机构 Equifax 遭受黑客攻击,导致1.4亿个人的敏感信息泄露: 2020年,发生了 SolarWinds 公司的软件供应链遭受恶意代码攻击事件,涉及多个行业和国家: 20 ...
- 微软开源 Azure Functions MCP Extension
Azure Functions MCP Extension 是微软推出的开源扩展库,旨在将 Azure Functions 与模型上下文协议(Model Context Protocol, MCP) ...
- MinHook 如何对 .NET 母体 CoreCLR 进行拦截
一:背景 1. 讲故事 这篇文章起源于和一家 .NET公司 开线上会议时,提出的一个场景问题,程序出现了非托管内存暴涨,这些非托管内存关联的对象都囤积在 终结器队列 中,很显然这是代码中没用 usin ...
- 简单的sqlHelper类
public class SQLHelper { //连接数据库 static string connStr = ConfigurationManager.Conn ...
- 酒馆SillyTavern安装使用,打造专属AI聊天
一.什么是 SillyTavern? 这是一个"让AI陪你角色扮演聊天"的神器. 它是一个 前端聊天界面,可以接入 ChatGPT.Claude.geminì,甚至自己本地跑的模型 ...
- ubuntu 安装flash
安装一直失败 转载 ubuntu 14.04安装flash无效的解决方法 144 作者 Devid 关注 2015.11.20 20:44* 字数 350 阅读 1701评论 1喜欢 0 原文出处:h ...