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);点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号