PHP魔术常量trait
作用:PHP中使用trait关键字是为了解决一个类既想集成基类的属性和方法,又想拥有别的基类的方法,而trait一般情况下是和use搭配使用的。trait就是解决了继承只能继承一个的缺陷 实例:
<?phptrait Drive {public $carName = 'trait';public function driving() {echo "driving {$this->carName}\n";}}class Person {public function eat() {echo "eat\n";}}class Student extends Person {use Drive;public function study() {echo "study\n";}}$student = new Student();$student->study();$student->eat();$student->driving();//www.jb51.net/article/114247.htm?>
study
eat
driving traitStudent类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。
如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?
结论当方法或属性同名时,当前类中的方法会覆盖trait方法,而 trait 的方法又覆盖了基类中的方法。
<?php trait Drive {public function hello() {echo "hello drive\n";}public function driving() {echo "driving from drive\n";}}class Person {public function hello() {echo "hello person\n";}public function driving() {echo "driving from person\n";}}class Student extends Person {use Drive;public function hello() {echo "hello student\n";}}$student = new Student();$student->hello();$student->driving();
?>
hello student
driving from drive
结论当方法或属性同名时,当前类中的方法会覆盖trait方法,而 trait 的方法又覆盖了基类中的方法。
多个trait重名的时候会有fatal error
如果要组合多个Trait,通过逗号分隔 Trait名称:
use Trait1, Trait2;
如果多个Trait中包含同名方法或者属性时,会怎样呢?
答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。
PHP Fatal error: Trait method hello has not been applied, because there are
collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20<?php
trait Trait1 {public function hello() {echo "Trait1::hello\n";}public function hi() {echo "Trait1::hi\n";}
}
trait Trait2 {public function hello() {echo "Trait2::hello\n";}public function hi() {echo "Trait2::hi\n";}
}
class Class1 {use Trait1, Trait2;
}
?>
使用insteadof和as操作符来解决冲突,
使用insteadof和as操作符来解决冲突,
insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码<?php
trait Trait1 {public function hello() {echo "Trait1::hello\n";}public function hi() {echo "Trait1::hi\n";}
}
trait Trait2 {public function hello() {echo "Trait2::hello\n";}public function hi() {echo "Trait2::hi\n";}
}
class Class1 {use Trait1, Trait2 {Trait2::hello insteadof Trait1;Trait1::hi insteadof Trait2;}
}
class Class2 {use Trait1, Trait2 {Trait2::hello insteadof Trait1;Trait1::hi insteadof Trait2;Trait2::hi as hei;Trait1::hello as hehe;}
}
$Obj1 = new Class1();
$Obj1->hello();
$Obj1->hi();
echo "\n";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();
?>Trait2::hello
Trait1::hiTrait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法
as关键词还有另外一个用途,那就是修改方法的访问控制:
Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法,测试代码如下:<?php
trait Hello {public function sayHello() {echo "Hello\n";}
}
trait World {use Hello;public function sayWorld() {echo "World\n";}abstract public function getWorld();public function inc() {static $c = 0;$c = $c + 1;echo "$c\n";}public static function doSomething() {echo "Doing something\n";}
}
class HelloWorld {use World;public function getWorld() {return 'get World';}
}
$Obj = new HelloWorld();
$Obj->sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "\n";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();
?>Hello
World
get World
Doing something
1
2
https://www.jb51.net/article/114247.htm
PHP魔术常量trait相关推荐
- 雷林鹏分享:PHP 魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们 ...
- php超全局变量,魔术常量,魔术方法
整理了下关于php的基础知识,参考了些资料,如下: 超全局变量 超全局变量 - 超全局变量是在全部作用域中始终可用的内置变量: $GLOBALS $GLOBALS - 引用全局作用域中可用的全部变量 ...
- PHP的魔术常量魔术方法超全局变量
1.魔术常量 概念:所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化. __LINE__ 获取文件中的当前行号 __FILE__ 获取文件的完整路径和文件名 __DIR__ 获 ...
- PHP中的预定义常量和魔术常量
魔术常量(8个) 1.__LINE__ 返回文件中的当前行号. 2.__FILE__ 返回文件的完整路径和文件名.如果用在包含文件中,则返回包含文件名.自 PHP 4.0.2 起,__FILE__ 总 ...
- 几个 PHP 的“魔术常量”
几个 PHP 的"魔术常量" __LINE__ 文件中的当前行号. __FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名.自 PHP 4.0.2 起 ...
- php --魔术常量 /魔术方法
魔术常量: 1. __LINE__ 返回文件中的当前行号. 2. __FILE__ 返回所在文件的完整路径.包含文件名 3. __FUNCTION__ 返回所在函数名称. 4. __CLASS__ 返 ...
- php中数据类型、数组排序、循环语句、混编、操作本地文件流程、常用API、函数、魔术常量
php中数据类型: php中有7种数据类型,分别是: //1.String字符串,用引号包裹的字符,如:$str = 'hello word';//2.Integer整型,可以是正数或负数,有十进制. ...
- php 魔术函数,PHP魔术函数、魔术常量、预定义常量
一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__des ...
- PHP 魔术常量,__LINE__,__FILE__,__DIR__等等8个常用魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们 ...
最新文章
- 找不到php的版本,php – 在任何版本中都找不到请求的包…
- JarvisOJ Basic 熟悉的声音
- CF1042D Petya and Array
- 建站篇-数据库-修改默认users表
- 安装webpack命令环境
- Linux实操篇②(远程连接Linux;Xshell 6 和 Xftp 6 工具的安装;Xshell 6 和 Xftp 6 工具的配置和使用;)
- PAT Java实现厘米换算英尺英寸
- python ttf font weight_使用FontCreator将ttf字体制作多字重字体并打包为Magisk字体模块...
- GDSOI 2016 T2 星际穿越
- python做视频剪辑_视频自媒体人们,还用什么快剪辑,爱剪辑,几行python搞定一切...
- 外贸开发信用什么邮箱好?这个邮箱靓号注册网站不要错过
- 苏宁易购获得suning商品详情 API 返回值说明
- windows下使用VS2010编译jpeglib
- 自考学历和成考学历哪个更高一些 有啥区别
- 词频统计之《哈姆雷特》
- 什么是好的BIM轻量化引擎
- echars大屏开发案例
- 官方发布|BSV区块链协会推出全新智能合约转译器
- 【论文翻译】Graph Convolution over Pruned Dependency Trees Improves Relation Extraction
- 第二部分:二十三种设计模式解读——什么是工厂方法模式
热门文章
- lucene和elasticsearch的前世今生、elasticsearch的核心概念、elasticsearch核心概念 vs. 数据库核心概念(来自学习资料)
- 什么是HADOOP、产生背景、在大数据、云计算中的位置和关系、国内外HADOOP应用案例介绍、就业方向、生态圈以及各组成部分的简介(学习资料中的文档材料)
- Oracle 11g客户端及PLSQL Developer配置|Instant Client Setup-64位|OraClientLite11g_x86
- 2Boost之UPD,Client and Server
- Linux redhat下安装jdk-6u45-linux-x64.bin
- Python AdaBoost提升算法
- android 实现定时通知,在Android中创建定时通知(例如,针对事件)
- 二分平均值聚类 java_二分K-均值聚类算法
- python字符串成熟编码_python字符串转公式两种方法获取网页编码python版
- mysql增删改查 dao_MYSQL 之 JDBC(七):增删改查(五) DAO设计模式