分级的命名空间实现类的自动加载,理解trait类的功能与使用场景—2019年10月10日

2019年10月11日 22:24:43阅读数:441博客 / L先生的博客 / 作业

命名空间

写一个分级的命名空间, 并实现类的自动加载
新建test.php

<?php

namespace test\one\two\three;

class Test1{

    public static function demo() {

        return __METHOD__;

    }

}

class Test2{

    public static function demo(){

        return __METHOD__;

    }

}

新建ceshi.php

<?php

//命名空间的别名引用

namespace cs;

include __DIR__ . '/test.php';

use test\one\two\three\Test1 as T;

echo T::class;

//结果:test\one\two\three\Test1

echo '<hr>';

// 如果省略as ,那么当前类的别名就是当前类的去掉空间名称的类名

use test\one\two\three\Test1;

echo Test1::class;

//结果:test\one\two\three\Test1

// use

// 默认从全局开始, 可以省略掉: \

// as 给当前的空间名称起一个别名

// 防止当前空间名称命名冲突

使用use实现类的自动加载。

trait类

介于父类和子类之间,解决PHP的单继承的一种代码复用机制。

实例

<?php
namespace cs;
// 两个 trait 都插入了一个同名的方法,解决方法
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{
        // insteadof单词的意思为代替
        B::smallTalk insteadof A;    //可以理解为trait B里面的smallTalk方法代替trait A里面的,优先级高
        A::bigTalk insteadof B;    //可以理解为trait A里面的bigTalk方法代替trait B里面的,优先级高
    }
}

$obj = new Talker();
$obj ->smallTalk();   //结果:b
$obj ->bigTalk();   //结果:A

echo '<br>';
class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;  //B的smalltalk方法优先级高于A的
        A::bigTalk insteadof B;    //A的bigtalk方法优先级高于B的
        B::bigTalk as Btalk;  //如果想要运行B的bigTalk可以单独设置别名
        A::smallTalk as atalk;  //如果想要运行B的bigTalk可以单独设置别名
    }
}
$obj1 = new Aliased_Talker();
$obj1 ->smallTalk();   //结果:b
$obj1 ->bigTalk();   //结果:A
$obj1 ->Btalk();  //结果:B
$obj1 ->atalk();  //结果:a

?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

结果:

bA

bABa

总结:

trait介于父类和子类之间,子类继承父类,use trait,子类有trait的方法,创建子类对象,运行方法是运行的子类里面的,如果子类里面没有这个方法,会运行trait里面的,如果trait里面没有就会运行父类里面的。

子类use的多个trait的里面有相同的方法,可以使用insteadof或者as来解决。

批改状态:合格

老师批语:根据最新的编程规范, 类的推荐语法应该是: class 类名 { // .... }

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    L先生的博客
    博文
    28
    粉丝
    0
    评论
    0
    访问量
    15667
    积分:0
    P豆:60
    博文分类
    作业28篇