Blogger Information
Blog 34
fans 1
comment 1
visits 40831
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类的自动加载,接口常量的原理与实现,后期静态绑定,命名空间分层结构,Trait技术——2019年8月5日22时04分
嘿哈的博客
Original
880 people have browsed it

类的自动加载

需要用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'];

运行实例 »

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


Correction status:qualified

Teacher's comments:总结的不错,这是亮点
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post