Day24 类别与物件--魔术方法3、trait

这里连结上一天说的内容,上一天没有举例,因为有点篇幅太多了,所以直接在今天的开头写个例子~~

<?php
//写一个熊生活
class BearLife
{
    //成员属性	
    public $type = 'Animal';
    public $memory = 'I\'m cute.';
    public $food = 'Fish';
    static public $habit = '看动漫';
    static public $color = 'Brown';
    //成员方法
    function playGame()
    {
        echo '玩~玩起来~好想玩桌游><';
    }
    function seeMovie()
    {
        echo $this->food . '怕又爱看鬼片,吓吓自己身体壮';
    }
    static function slogan()
    {
        echo '能走就不要坐,能坐就不要躺......的相反 ';
    }
    static function music()
    {
        echo '超爱听说唱!';
    }
    function test()
    {
        //两种访问方式
        //类名方式
        //echo BearLife::$habit;
        //self关键
        echo self::$habit;
    }
}

// echo BearLife::$color;
BearLife::music();
// BearLife::slogan();
$one = new BearLife;
	//BearLife::seeMovie();
	//$one->test();
	//调用静态成员方法
	//$one->music();
	//无法调用
	//echo $one->habit;
	///echo BearLife::$habit;

其他尚未介绍到的魔术方法

  1. __sleep()

    • 触发时机:物件进行串行化操作时自动触发
    • 功能:指定需要串行化的成员属性
    • 参数:无
    • 返回值:需要返回一个数组类型,每个元素都是需要串行化的成员属性名
  2. __wakeup()

    • 触发时机:物件反串行化操作时自动触发
    • 功能:反串行化操作时修改部分成员属性
    • 参数:无
    • 返回值:无
  3. __clone()

    • 触发时机:对物件进行克隆操作时自动触发
    • 功能:修改克隆之後的物件的部分成员属性
    • 参数:无
    • 返回值:无
  4. 魔术方法 __autoload()

    • 触发时机:当页面中需要一个类,而该类不存在时自动触发
    • 功能:实现类的自动加载
    • 参数:1个 不存在的类名
    • 返回值:没有

trait的声明及使用

  • trait声明在名子前加trait关键字即可
    • 格式:trait 名字{
      //成员方法
      //成员属性
      }
  1. trait里面可以包含成员方法、成员属性
  2. 支持关键字及其他修饰词(final\static\abstract)
  3. trait不能通过new关键字来实例化,可以在类中通过use关键字後面加trait声明的名字进行引入到当前类中
  4. use引入trait可以同时引入多个trait,使用英文逗号进行分割。
  5. 如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生错误,为了解决多个trait在同一个类中的命名冲突,需使用insteadof操作符,明确指定使用冲突方法中的哪一个
  6. as操作符可以为某个方法引入别名,但是as操作符不会对方法进行重命名,也不会影响其方法
  7. 单个Trait也可由多个trait组成。
  8. trait支持抽象的使用,也支持静态方法的使用。
  9. trait会覆盖调用类继承的父类方法

命名空间

命名空间用来解决重名问题,将代码划分不同的区域,每个区域的常量、函数和类的名字互补影响

定义命名空间使用namespace关键字声明:

  1. namepsance需要写在PHP脚本的顶部,必须是第一个PHP指令,不要在namespance前面出现非PHP代码,HTML或者空格。
  2. 从定义namespace出现开始,到下一个namespace出现之前或者脚本运行结束时都是一个独立的空间。
    • 注意:如果为相同代码定义多个命名空间是不可能的,只能被最後一个包含。
  3. 在同一文件中可以定义不同的命名空间
  4. define方式定义的常量归公共空间所有,不归命名空间所有。
    归命名空间所有的常量只能用const来声明。
    PS. 公共空间:
    • 没有定义命名空间的函数、类、常量都是归属於公共空间
    • 公共空间的代码被引入到某个命名空间下以後,该公共空间中的代码不属於任何命名空间内。

<<:  Day 24:路由搜查队-route.query

>>:  Day 24 Flask-Mail

【Day 15】从零开始的 Debug 生活 - Debugger 原理

环境 Windows 10 21H1 x64dbg Aug 2 2020, 13:56:14 IDA...

[Day 1] 资料产品简介

前言 大数据、AI 是这几年的热门议题,不管是公司还是客户都会开始透过资料分析或机器学习来改善自家产...

Day 2 [Python ML] 基础资料处理

前言 在这系列文章中,我会使用Azure来运行所有的程序,如何使用Azure的文章在这里 这边则是使...

[Day 08] - Spring Boot 实作登入验证(二)(JWT浅析)

第8天,再撑...22天... 我觉得...有必要继续深入探讨JWT JWT(JSON Web To...

从「递回」策略迁移到「堆叠」暂存

再探链结串列与树结构 在前三天的刷题实战中,我们一起实作了线性的链结串列和非线性的树相关的题目。其...