博客列表 >接口中的常量、后期静态绑定、命名空间的层级关系、使用空间别名简化命名空间、Trait 技术--2019/08/05

接口中的常量、后期静态绑定、命名空间的层级关系、使用空间别名简化命名空间、Trait 技术--2019/08/05

LISTEN的博客
LISTEN的博客原创
2019年08月07日 17:14:23713浏览

1、接口中的常量

实例

<?php
namespace _0805test;

// 接口常量
if(!interface_exists(__NAMESPACE__.'iDbParam')){
    interface iDbParam
    {
        // 使用接口常量来创建数据库的连接参数
        const TYPE='mysql';
        const HOST='localhost';
        const USERNAME='root';
        const PASSWORD='root';
        const DBNAME='listen0724';
        public static function connection();
    }
}

class Link implements namespace\iDbParam
{
    // 初始化连接参数
    private static $type=iDbParam::TYPE;
    private static $host=iDbParam::HOST;
    private static $username=iDbParam::USERNAME;
    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;
        $pdo= new \PDO($dsn,$user,$password);
        return $pdo;
    }

}

$link=Link::connection();
$sql='select * from `nav` limit :limit';
$stmt=$link->prepare($sql);
$stmt->bindValue('limit',2,\PDO::PARAM_INT);
//$stmt->debugDumpParams();
//die();
$stmt->execute();
$res=$stmt->fetchAll(\PDO::FETCH_ASSOC);

foreach ($res as $re){
    echo '<pre>';
    print_r($re);
}

运行实例 »

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


2、后期静态绑定

实例

<?php
namespace _0805test;

// 后期静态绑定: 延迟静态绑定
// 场景:用在静态继承的上下文环境中

class A
{
    public static function who()
    {
        echo __CLASS__;
    }

    public static function test()
    {
//        self::who(); //B::test(); 值为_0805test\A

        // 让该方法的调用者(类)在调用的时候(执行的时候)再确定是哪个类?
        static::who(); //B::test(); 值为_0805test\B
    }

}

class B extends A
{
    // 重写父类A中的who()
    public static function who()
    {
        echo __CLASS__;
    }
}

B::test();

echo '<hr>';

class Test1
{
    public static function connect()
    {
//        return self::config();
        return static ::config();
    }

    public static function config()
    {
        return new \PDO('mysql:host=localhost;dbname=listen0724','root','1111');
    }
}

class Link extends Test1
{
    public static function config()
    {
        return new \PDO('mysql:host=localhost;dbname=listen0724','root','root');
    }
}

$pdo=Link::connect();
var_dump($pdo);

运行实例 »

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


3、命名空间的层级关系

实例

<?php
namespace _0805test;

echo '当前命名空间:'.__NAMESPACE__.'<br>';
class Test{}
echo Test::class.'<hr>';


// 创建一个二级命名空间
namespace _0805test\one;

echo '当前命名空间:'.__NAMESPACE__.'<br>';
class Test{}
echo Test::class.'<br>';

// 关键字: namespace, 引用当前的命名空间,类似于类中的self
echo namespace\Test::class.'<hr>';

// 在这个二级空间中, 访问三级空间中的成员
echo \_0805test\one\two\Test::class.'<br>';
echo namespace \two\Test::class;


echo '<hr>';
// 创建三级命名空间
namespace _0805test\one\two;
echo '当前命名空间:'.__NAMESPACE__.'<br>';
class Test{}
echo Test::class.'<br>';

运行实例 »

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


4、使用空间别名简化命名空间

实例

<?php
namespace _0805test;

// 利用空间别名来简化命名空间的名称

include __DIR__."/Test.php";

$res=namespace\one\two\three\Test1::class;
echo $res::demo();
echo class_exists($res)?$res.' 类存在':' 类不存在';

echo '<hr>';

use \_0805test\one\two\three\Test2 as T2;
echo T2::demo();

//use _0805test\one\two\three\Test1 as Test1;//如果类名与别名一致,可以省略as
use _0805test\one\two\three\Test1;
echo Test1::demo();

运行实例 »

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

Test.php代码

实例

<?php
namespace _0805test\one\two\three;

class Test1
{
    public static function demo()
    {
        return __NAMESPACE__.'<br>'.__METHOD__.'<hr>';
    }
}

class Test2
{
    public static function demo()
    {
        return __NAMESPACE__.'<br>'.__METHOD__.'<hr>';
    }
}

运行实例 »

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


5、命名空间的实战小案例

实例

<?php
namespace _0805test;

use PDO;//use \PDO;

//命名空间的实战小案例

interface iDb
{
    const DSN='mysql:host=localhost;dbname=listen0724';
    const USER='root';
    const PASSWORD='root';
}

$pdo=new PDO(iDb::DSN,iDb::USER,iDb::PASSWORD);
$sql='select * from `nav` limit :limit';
$stmt=$pdo->prepare($sql);
$stmt->bindValue('limit',2,\PDO::PARAM_INT);
//$stmt->debugDumpParams();
//die();
$stmt->execute();
$res=$stmt->fetchAll(\PDO::FETCH_ASSOC);

foreach ($res as $re){
    echo '<pre>';
    print_r($re);
}

运行实例 »

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


6、Trait 技术

实例

<?php
namespace _0805test;

use PDO;

// trait:
/*
 * 为什么要用 Trait?
 * 1. php是单继承的语言, 即一个类只允许最多一个父类中继承成员
 * 2. trait是一个与"类"类似的数据结构,内部可以声明一些方法或属性,供调用者使用
 *
 * Trait 解析了什么问题?
 * 1. 解决php只能从一个类中继承成员的问题
 * 2. 最大程度的实现了代码复用
 * 3. 对一些无法用类进行封装的功能,使用Trait封装更加的方便,实用
 */

// trait的创建语句与class类是完全一样的
// trait 使用 trait 关键字来声明, 同样, 也不允许实例化,只能是调用类调用

trait Db
{
    public function connect($dsn, $username, $password)
    {
        return new PDO($dsn,$username,$password);
    }
}

trait Query
{
    public function get($pdo,$where)
    {
        $where=empty($where)?'':' where '.$where;
        $sql='select * from `nav` '.$where.' limit 1';
        $stmt=$pdo->prepare($sql);
//        die($stmt->debugDumpParams());
        $stmt->execute();
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}

class Client
{
    use db;
    use Query;

    public $pdo=null;

    public function __construct($dsn,$username,$password)
    {
        $this->pdo=$this->connect($dsn,$username,$password);
    }

    public function find($where)
    {
        return $this->get($this->pdo,$where);
    }
}

$dsn = 'mysql:host=localhost;dbname=listen0724';
$username = 'root';
$password = 'root';

$client= new Client($dsn,$username,$password);
$res=$client->find('nav_id>2');
print_r($res);

运行实例 »

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

 

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