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

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

L先生的博客
L先生的博客原创
2019年10月11日 22:24:43592浏览

命名空间

写一个分级的命名空间, 并实现类的自动加载
新建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来解决。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议