登录  /  注册
博主信息
博文 26
粉丝 0
评论 3
访问量 18886
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
分级的命名空间与trait类/2019/10/10
西门吃雪
原创
598人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学