spl_autoload_register 註冊自動載入涉及的佇列資料結構你懂嗎

勺顛顛發表於2019-06-27

spl_autoload_register
這個函式不用多說,大家都經常用,大部分框架幾乎用這函式來完成的類自動載入功能,所以我不會在這裡說怎麼使用,怎麼寫程式碼去測試這個函式,沒有必要,不是我說的內容。
spl_autoload_register註冊自動載入引發的小知識
我們注意到這函式提到了佇列,laravel,thinkphp,yii都支援composer,但同時都有自己的載入方法,下圖來源於laravel的核心程式碼
spl_autoload_register註冊自動載入涉及的佇列資料結構你懂嗎
composer的一個自動載入原始碼
spl_autoload_register註冊自動載入涉及的佇列資料結構你懂嗎
佇列概念:
佇列是一種線性表的特殊結構,僅允許某一端運算元據【插入或是刪除資料】,一般能插入資料的一端為隊尾,能出資料的另一端般為隊頭,資料元素進佇列的過程就是入隊,資料元素出佇列的過程就是出隊,是一種先進先出即FIRST IN FIRST OUT FIFO的資料結構。
資料元素:由資料項構成
資料:是描述事物的一種符號,能被計算機系統識別和處理的符號。
線性表:是一種含有0個或多個資料元素的有限位序,線性表有前驅元素和後繼元素,每個資料結點有自己的位序,一般儲存方式有順序儲存和鏈式儲存即順序表和連結串列【所以你應該聽過單連結串列以及迴圈連結串列約瑟夫環這種資料結構】 所以對佇列操作時【進隊】一般會有一個遊標指向當前的隊頭所在的位置【如果是連結串列一般由指標域指向隊頭所在位置】,同時出隊時也會有一個遊標指向佇列的隊尾位置。在進隊以及出隊時,遊標位置發生變化,下面我用PHP程式碼模擬實現佇列的基本功能。

<?php
/**
 * Created by PhpStorm.
 * User: 1655664358@qq.com
 * Date: 2019/6/27
 * Time: 9:30
 */
define('MAXSIZE',5);//佇列空間大小
/**
 * @param $queue 佇列儲存空間
 * @param $front 佇列隊頭遊標
 * @param $near  佇列隊尾遊標
 * @param $data  進隊的資料
 * @return int
 */
function enQueue(&$queue,$front,$near,$data)
{
    if (($near+1)%MAXSIZE==$front){
        throw new RuntimeException("隊空間已滿");
    }
    $queue[$near%MAXSIZE] = $data;
    $near+=1;
    return $near;
}

/**
 * 出隊操作
 * @param $queue
 * @param $front
 * @param $near
 * @return int
 */
function deQueue(&$queue,$front,$near)
{
    if ($front==$near%MAXSIZE){
        throw new RuntimeException("空佇列");
    }
    $data = $queue[$front];
    echo "出隊元素:".$data.PHP_EOL;
    $front = ($front+1)%MAXSIZE;
    return $front;
}
$a = [];//佇列 使用陣列模擬
$front = $near = 0;//遊標初始化
$near = enQueue($a,$front,$near,1);
$near = enQueue($a,$front,$near,2);
$near = enQueue($a,$front,$near,3);

$front = deQueue($a,$front,$near);
$front = deQueue($a,$front,$near);
$front = deQueue($a,$front,$near);
//$front = deQueue($a,$front,$near);

$near = enQueue($a,$front,$near,100);
$front = deQueue($a,$front,$near);

$near = enQueue($a,$front,$near,1);
$near = enQueue($a,$front,$near,2);
$near = enQueue($a,$front,$near,3);
$near = enQueue($a,$front,$near,4);
$front = deQueue($a,$front,$near);
$front = deQueue($a,$front,$near);
$front = deQueue($a,$front,$near);
$front = deQueue($a,$front,$near);

spl_autoload_register註冊自動載入涉及的佇列資料結構你懂嗎

當然佇列也可以支援在隊頭或是隊尾實現進隊操作,也可以實現在隊頭或是隊尾實現出隊操作,特殊的線性表如棧就是某一端實現資料的壓棧和彈棧操作,棧底不實現操作,當然使用PHP提供的陣列函式可以輕鬆實現佇列和棧的模擬操作。
佇列實現了先進先出FIFO的功能,在許多應用中如佇列系統,排隊買票等都應用到了,比如我們用的redis快取系統中的列資料型別List,它便能完成佇列的功能,而低層的知識仍然是重點!

相關文章