類的自動加載
需要用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; //自動加載函數(shù) 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'; //調用自動加載函數(shù) 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() 檢查函數(shù)是否不存在;
!class_exists() 檢查類當前是否不存在;
!interface_exists() 檢查接口是否不存在;
date() 格式化時間戳 ; date('Y/m/d',$staff['hiredate']);
后期靜態(tài)綁定:
static::函數(shù)名() 使用這個,當子類調用該方法,他就執(zhí)行 子類繼承父類的方法 在子類里執(zhí)行,而不是在執(zhí)行父類的方法
self::函數(shù)名() 使用這個,當子類調用該方法,他依舊執(zhí)行父類的方法,沒有執(zhí)行子類繼承的父類方法
命名空間的分層結構
namespace demo; class A 一級命名空間
namespace demo\demo1; class A 二級命名空間
訪問二級命名空間類:
echo namespace\A::class <=> demo\demo1\A::class
Trait技術與應用場景
1.Trait 解決了只能從一個類中繼承成員問題
2.代碼復用
3.創(chuàng)建語句與類相同;
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>";
}
運行實例 ?后期靜態(tài)綁定解釋實例
<?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顯示效果(執(zhí)行的是C類中的who())
C::test(); // _0805\C
echo '<hr>';
//用self顯示效果(執(zhí)行的是A類中的who())
C::test1(); //_0805\A
運行實例 ?后期靜態(tài)綁定應用實例
<?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數(shù)據(jù)庫連接
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;
//構造函數(shù)
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);
//執(zhí)行sql
$res = $client->insert($data);
//返回結果
echo '成功的新增了 '. $res['count']. '條記錄, 新增的記錄的ID是: '. $res['id'];
運行實例 ?
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號