博客列表 >命名空间分级管理和trait----2019-10-10

命名空间分级管理和trait----2019-10-10

sjgbctjda的博客
sjgbctjda的博客原创
2019年10月29日 15:09:21886浏览
  1. 写一个分级的命名空间, 并实现类的自动加载

<?php

spl_autoload_register(function($className){

    $path = str_replace('\\', DIRECTORY_SEPARATOR, $className); 

    $path = __DIR__.'\\'. $path.'.php';

    // echo $path;

    if(file_exists($path)) include $path;
}
);
echo \inctest\inc\test\test::getInfo(),'<hr>';

use \inctest\inc\test as myNamespace;   //为命名空间起一个别名

echo myNamespace\test::getInfo(),'<hr>';

echo \inctest\test::getInfo(),'<hr>';

echo \inctest\test1::getInfo1(),'<hr>';

结果:

1010task1-1.png

1010task1.png

2. 写一个trait类, 理解它的功能与使用场景

<?php
namespace test;

trait one
{
    public function one()
    {
        return '这是trait one中的方法1';
    }
    public function two()
    {
        return '这是trait one中的方法2';
    }
}

trait two 
{
    public function one()
    {
        return '这是trait two中的方法1';
    }
    public function two()
    {
        return '这是trait two中的方法2';
    }
}
trait three
{
    public function A()
    {
        return '这是trait three中的方法A';
    }
    public function B()
    {
        return '这是trait three中的方法B';
    }
}
class A
{
    use three;
    public function one()
    {
        return '这是类A中的方法one';
    }
    public function two()
    {
        return '这是类A中的方法two';
    }
    public function A()
    {
        return '这是类A中的方法A';
    }
    public function B()
    {
        return '这是类A中的方法B';
    }
}

class B extends A
{
    use one
    {
        one::one insteadof two;
        one::two insteadof two;
    }
    use two
    {   
        two::one as first;
        two::two as second;
    }
    public function A()
    {
        return '这是类B中的方法A';
    } 
}

$B = new B();
echo $B->one(),'<hr>';
echo $B->two(),'<hr>';
echo $B->first(),'<hr>';
echo $B->second(),'<hr>';
echo $B->A(),'<hr>';
echo $B->B(),'<hr>';

运行结果:

1010他上课.png

总结:

    1.在使用命名空间和自动加载时,因为使用类名来组成require或者include引入的文件名称,所以在加载有命名空间的类的时候,这个类的命名空间需要和该类所在脚本的路径统一,并且尽量一个脚本只有一个类。使用use关键字是在类加载完成后,在调用类的时候,可以给类的命名空间起一个别名减少代码量。

    2.trait的使用目的目的是为了克服php单继承的缺点,trait的语法和类的语法完全一样,只是在trait中不能写构造方法,并且不能实例化trait。子类、父类和trait的方法和属性优先级:子类在调用方法时,自身的方法优先级最高,1、当trait是在子类中use的引入的时候,trait中的方法优先级大于父类中的方法,此时优先级子类>trait>父类;2、当trait是在父类中用use引入的时候,父类中的方法优先级大于trait中的方法,此时优先级子类>父类>trait。当不同的trait中有同名方法的时候,可以用insteadof关键字来确定使用哪一个trait中的该方法,其他的trait中的该方法可以用as关键字来起一个别名进行应用。


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