类的自动加载
需要用str_replace() 转换'\'符号
file_exists() 检测文件是否存在;
要自动加载,需要命名空间与文件路径一致,再利用转换语法,将命名空间的名字 ' \ ' 转换成 ' / '
再用spl_autoload_register(function($className){ } ); 实行自动加载;
文件路径保存:
<?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'];
运行实例 »