10月10日作业:
1. 写一个分级的命名空间, 并实现类的自动加载
首先写一个demo10.php
<?php namespace _001; //类的自动加载 spl_autoload_register(function ($className){ $path = str_replace('\\', DIRECTORY_SEPARATOR, $className); $path = __DIR__ .'/'. $path . '.php'; if (file_exists($path)) include $path; }); // use // 默认从全局开始, 可以省略掉: \ // as 给当前的空间名称起一个别名 // 防止当前空间名称命名冲突 // 如果省略as ,那么当前类的别名就是当前类的去掉空间名称的类名 use __001\one\Test1 as T1; use __001\one\two\Test2 as T2; use __001\one\two\three\Test3 as T3; use __001\one\two\three\four\Test4 as T4; echo T1::class; echo '<br>'; echo T2::class; echo '<br>'; echo T3::class; echo '<br>'; echo T4::class; echo '<br>'; ?>
同时创建4个小文件如图
Test1.php
<?php namespace _001\one; class Test1{ public static function demo(){ return __METHOD__; } } ?>
Test2.php
<?php
namespace __001\one\two;
class Test2{
public static function demo(){
return __METHOD__;
}
}
?>
Test3.php
<?php
namespace __001\one\two\three;
class Test3{
public static function demo(){
return __METHOD__;
}
}
?>
Test4.php
<?php
namespace __001\one\two\three\four;
class Test4{
public static function demo(){
return __METHOD__;
}
}
?>
运行效果图
如下
2. 写一个trait类, 理解它的功能与使用场景
<?php namespace _1010; use PDO; // trait trait Db { // 连接数据库 public function connect($dsn, $username, $password) { return new PDO($dsn, $username, $password); } } trait Query { public function get(PDO $pdo, $where = '') { $where = empty($where) ? '' : ' WHERE ' . $where; //查询条件 $stmt = $pdo->prepare('SELECT * FROM `staff` '. $where . ' LIMIT 1'); //sql语句 $stmt->execute(); //执行语句 return $stmt->fetch(PDO::FETCH_ASSOC); //返回结果支PDO::FETCH_ASSOC只取关联部分 } } // 客户端调用: 工作类 class Client { // 在宿主类Client中引入上面声明的二个Trait类/方法库 use Db; // .... use Query; public $pdo = null; public function __construct($dsn, $username, $password) { // 调用的是trait: Db中的方法connect() $this->pdo = $this->connect($dsn, $username, $password); } // 调用的是Trait: Query中的方法:get() public function find($where) { return $this->get($this->pdo, $where); } } $dsn = 'mysql:dbname=php'; $username = 'root'; $password = '123456'; $client = new Client($dsn, $username, $password); echo '<pre>'. print_r($client->find('age < 30'), true);
运行效果图
如下
总结
str_replace 此函数可以实现字符串替换
DIRECTORY_SEPARATOR 目录分隔符:用于判断是反斜线还是正斜线 windows系统是反斜线 lunix 是正斜线
__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
file_exists — 检查文件或目录是否存在
use
默认从全局开始, 可以省略掉: \
as 给当前的空间名称起一个别名
防止当前空间名称命名冲突
如果省略as ,那么当前类的别名就是当前类的去掉空间名称的类名
Trait类 用在父类和子类之间
Trait类 :不允许实例化
eg: 当父类 Trait类 子类中
子类有demo方法调用子类
子类没有demo方法就会调用Trait类方法, 换句话说Trait类方法将父类的方法给覆盖了.也可以理解为Trait类也是父类但是优先级比父类要高
Trait类 有利于团队开发合作 覆盖父类