分级的命名空间与trait类/2019/10/10

2019年10月16日 16:20:52阅读数:492博客 / 西门吃雪 / 第8期前端开发

10月10日作业:
1. 写一个分级的命名空间, 并实现类的自动加载

首先写一个demo10.php

<?php 



namespace _001;

//类的自动加载
spl_autoload_register(function ($className){
    $path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
    $path = __DIR__ .'/'. $path . '.php';
    if (file_exists($path)) include $path;
});

// use
// 默认从全局开始, 可以省略掉: \
// as 给当前的空间名称起一个别名
// 防止当前空间名称命名冲突
// 如果省略as ,那么当前类的别名就是当前类的去掉空间名称的类名

use __001\one\Test1 as T1;
use __001\one\two\Test2 as T2;
use __001\one\two\three\Test3 as T3;
use __001\one\two\three\four\Test4 as T4;

echo T1::class;
echo '<br>';
echo T2::class;
echo '<br>';
echo T3::class;
echo '<br>';
echo T4::class;
echo '<br>';














 ?>

同时创建4个小文件如图

QQ截图20191016122507.jpg

Test1.php

<?php 



namespace _001\one;

class Test1{
    public static function demo(){
        return __METHOD__;
    }
}



 ?>

Test2.php

<?php 




namespace __001\one\two;


class Test2{

    public static function demo(){

        return __METHOD__;

    }

}








 ?>


Test3.php

<?php 



namespace __001\one\two\three;


class Test3{

    public static function demo(){

        return __METHOD__;

    }

}








 ?>


Test4.php

<?php 


namespace __001\one\two\three\four;


class Test4{

    public static function demo(){

        return __METHOD__;

    }

}





 ?>




运行效果图

如下

QQ截图20191016123051.jpg

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

<?php

namespace _1010;

use PDO;

// trait

trait Db
{
    // 连接数据库
    public function connect($dsn, $username, $password)
    {
        return new PDO($dsn, $username, $password);
    }
}

trait Query
{
    public function get(PDO $pdo, $where = '')
    {
        $where = empty($where) ? '' : ' WHERE ' . $where; //查询条件
        $stmt = $pdo->prepare('SELECT * FROM `staff` '. $where . ' LIMIT 1');  //sql语句

        $stmt->execute();  //执行语句
        return $stmt->fetch(PDO::FETCH_ASSOC);  //返回结果支PDO::FETCH_ASSOC只取关联部分
    }
}

// 客户端调用: 工作类
class Client
{
    // 在宿主类Client中引入上面声明的二个Trait类/方法库
    use Db; // ....
    use Query;

    public $pdo = null;

    public function __construct($dsn, $username, $password)
    {
        // 调用的是trait: Db中的方法connect()
        $this->pdo = $this->connect($dsn, $username, $password);
    }

    // 调用的是Trait: Query中的方法:get()
    public function find($where)
    {
        return $this->get($this->pdo, $where);
    }
}
$dsn = 'mysql:dbname=php';
$username = 'root';
$password = '123456';

$client = new Client($dsn, $username, $password);

echo '<pre>'. print_r($client->find('age < 30'), true);


运行效果图

如下

QQ截图20191016144548.jpg



                                                总结

 str_replace 此函数可以实现字符串替换

DIRECTORY_SEPARATOR  目录分隔符:用于判断是反斜线还是正斜线  windows系统是反斜线  lunix 是正斜线

__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

file_exists — 检查文件或目录是否存在

use

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

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

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

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

Trait类  用在父类和子类之间

Trait类 :不允许实例化

eg:         当父类      Trait类    子类中

子类有demo方法调用子类

子类没有demo方法就会调用Trait类方法, 换句话说Trait类方法将父类的方法给覆盖了.也可以理解为Trait类也是父类但是优先级比父类要高

Trait类  有利于团队开发合作  覆盖父类



批改状态:合格

老师批语:自动加载的回调方法, 不一定只是我课堂上的一种方法, 你也可以自己定义一个, 只要能实现自动载就可以

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

全部评论

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

条评论
  • 博主信息
    西门吃雪
    博文
    26
    粉丝
    0
    评论
    3
    访问量
    16004
    积分:0
    P豆:60