欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-11 13:41:58
...
  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>';

结果:

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

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

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>';

运行结果:

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

总结:

    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关键字来起一个别名进行应用。