博客列表 >类的自动加载,接口常量的原理与实现,后期静态绑定,命名空间分层结构,Trait技术——2019年8月5日22时04分

类的自动加载,接口常量的原理与实现,后期静态绑定,命名空间分层结构,Trait技术——2019年8月5日22时04分

嘿哈的博客
嘿哈的博客原创
2019年08月07日 13:58:37889浏览

类的自动加载

需要用str_replace() 转换'\'符号

file_exists() 检测文件是否存在;

要自动加载,需要命名空间与文件路径一致,再利用转换语法,将命名空间的名字 ' \ ' 转换成 ' / '

再用spl_autoload_register(function($className){ } ); 实行自动加载;

文件路径保存:

QQ图片20190807135733.png

自动加载代码实例

<?php

namespace _0805;

//require __DIR__ . '/inc/test/test1.php';
//
//echo \inc\test\test1::get();
//
////echo \inc\test\test2::class;
////$className = ltrim('_',\inc\test\test2::class);
//echo '<hr>';
//
//$path = str_replace('\\','/',\inc\test\test2::class);
//
//$path = __DIR__ . '/'.$path . '.php';
//
//require $path;
//    use inc\test\test2;
//自动加载函数
class Loader
{
    public static function autoLoader(){
    spl_autoload_register(function ($className){
        $path = str_replace('\\','/',$className);
        $path = __DIR__ . '/'.$path . '.php';
        if (file_exists($path)){
            require $path;
        }
    });
}
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


自动加载结果演示实例

<?php
namespace _0805;
//导入 自动加载文件
require 'autoload.php';
//调用自动加载函数
Loader::autoLoader();

//加载inc/test/test1.php的类
echo \inc\test\test1::get();
echo '<br>';

//加载inc/test/test2.php的一级命名空间类
echo \inc\test\test2::get();
echo '<br>';
//访问二级命名空间类需要先访问一级命名空间类
//加载inc/test/test2.php的二级命名空间类
echo \inc\test\test2\test2::get();

运行实例 »

点击 "运行实例" 按钮查看在线实例



接口常量的原理与实现

const定义一个常量;

!function_exists() 检查函数是否不存在;

!class_exists() 检查类当前是否不存在;

!interface_exists() 检查接口是否不存在;

date() 格式化时间戳 ; date('Y/m/d',$staff['hiredate']);


后期静态绑定:

static::函数名() 使用这个,当子类调用该方法,他就执行 子类继承父类的方法 在子类里执行,而不是在执行父类的方法

self::函数名() 使用这个,当子类调用该方法,他依旧执行父类的方法,没有执行子类继承的父类方法


命名空间的分层结构

namespace demo;  class A 一级命名空间

namespace demo\demo1;  class A 二级命名空间

访问二级命名空间类:

echo namespace\A::class  <=> demo\demo1\A::class


Trait技术与应用场景

1.Trait 解决了只能从一个类中继承成员问题

2.代码复用

3.创建语句与类相同;

4.不允许实例化,只能被调用

接口常量实例

<?php

    namespace _0805;
    use PDO;
    if (!interface_exists(__NAMESPACE__.'\iDbParam')){
        interface iDbParam
        {
            const TYPE = 'mysql';
            const HOST = '127.0.0.1';
            const USER_NAME = 'root';
            const PASSWORD = 'root';
            const DBNAME = 'php';
            public static function connection();
        }
    }

    class Contection implements namespace\iDbParam
    {
        private static $type = iDbParam::TYPE;
        private static $host = iDbParam::HOST;
        private static $username = iDbParam::USER_NAME;
        private static $password = iDbParam::PASSWORD;
        private static $dbname = iDbParam::DBNAME;

        public static function connection()
        {
            $dsn = self::$type.':host='.self::$host.';dbname='.self::$dbname;
            $user = self::$username;
            $password = self::$password;
            return new PDO($dsn,$user,$password);
        }

    }

    $link = Contection::connection();

    $stmt = $link->prepare('SELECT * FROM `staff` LIMIT :limit');
    $stmt->bindValue('limit','5',PDO::PARAM_INT);
    $stmt->execute();
    $staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($staffs as $staff)
    {
        $hiredate = date('Y/m/d',$staff['hiredate']);
        echo "<li>{$staff['staff_id']}---{$staff['name']}---{$staff['age']}---{$staff['position']}---$hiredate</li>";
    }

运行实例 »

点击 "运行实例" 按钮查看在线实例

后期静态绑定解释实例

<?php

namespace _0805;

class A
{
    public static function who()
    {
        echo __CLASS__ ;
    }
    public static function test()
    {
        static :: who();
    }
    public static function test1()
    {
        self::who();
    }
}

class C extends A
{
    public static function who()
    {
        echo __CLASS__;
    }
}
// 用static显示效果(执行的是C类中的who())
C::test();  // _0805\C
echo '<hr>';
//用self显示效果(执行的是A类中的who())
C::test1(); //_0805\A

运行实例 »

点击 "运行实例" 按钮查看在线实例


后期静态绑定应用实例

<?php

namespace _0805;

class Connect
{
    public static function config()
    {
        return new \PDO('mysql:host=127.0.0.1;dbname=php','root','root1');
    }
    public static function connect()
    {
        return self::config();
    }
    public static function  connect1()
        {
            return static::config();
        }

}
class Link extends Connect
{
    public static function config()
    {
        return new \PDO('mysql:host=127.0.0.1;dbname=php','root','root');
    }
}
//连接成功
Link::connect1();
//连接失败
//Link::connect();

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

<?php

    namespace demo;

    use PDO;

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

    trait Query
    {
        //添加条件
        public function set($pdo,$data)
        {
            $fields = ' (name, age, sex, position, mobile, hiredate) ';
            $values = ' (:name, :age, :sex, :position, :mobile, :hiredate) ';


            $stmt = $pdo->prepare('INSERT INTO `staff` '.$fields .' VALUES '.$values);
            $stmt -> execute($data);

//            die($stmt->debugDumpParams);

            return [
                'count' => $stmt ->rowCount(),
                'id' => $this->pdo -> lastInsertId()
            ];

        }
    }
    //客户端
    class Client
    {
        //导入两个方法集
        use Db;
        use Query;

        public $pdo = null;
        //构造函数
        public function __construct($dsn,$username,$password)
        {
            $this->pdo = $this ->connect($dsn,$username,$password);
        }
        public function insert($data)
        {
            return $this -> set($this->pdo,$data);
        }
    }

    $dsn = 'mysql:host=127.0.0.1;dbname=php';
    $username = 'root';
    $password = 'root';
    $data = [
        'name' => '洪吉潮',
        'age' => 18,
        'sex' => 1,
        'position' => '学生',
        'mobile' => '15626475734',
        'hiredate' => time()
    ];
       //实例化这个类
    $client = new Client($dsn,$username,$password);
      //执行sql
    $res = $client->insert($data);
    //返回结果
    echo '成功的新增了 '. $res['count']. '条记录, 新增的记录的ID是: '. $res['id'];

运行实例 »

点击 "运行实例" 按钮查看在线实例


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