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);
运行实例 »
点击 "运行实例" 按钮查看在线实例