小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PHP中的一些雜項函數(shù)學(xué)習(xí)

 硬核項目經(jīng)理 2021-09-06

PHP中的一些雜項函數(shù)學(xué)習(xí)

今天來學(xué)習(xí)的這些雜項函數(shù)在官方文檔中都是放在一個雜項擴(kuò)展中的,其實這些函數(shù)都并不是什么什么特別的擴(kuò)展,也不需要安裝什么東西就可以使用,它們就是一些簡單的功能函數(shù)而已。當(dāng)然,其中不少內(nèi)容也是我們經(jīng)常會使用的,這里就帶大家一起再學(xué)習(xí)學(xué)習(xí)。

常量操作

常量的操作相信對于我們?nèi)粘J褂?PHP 開發(fā)的小伙伴來說絕對不會陌生。不管是使用框架還是自己寫代碼,經(jīng)常會使用到常量相關(guān)的內(nèi)容。

define("A""Test A");
var_dump(A); // string(6) "Test A"
var_dump(B); // Warning: Use of undefined constant B - assumed 'B'

var_dump(constant('A')); // string(6) "Test A"
var_dump(constant('B')); // NULL
// PHP Warning:  Use of undefined constant B - assumed 'B'   

var_dump(defined('A')); // bool(true)
var_dump(defined('B')); // bool(false)

簡單地定義常量就是使用 define() 這個函數(shù),它有兩個參數(shù),第一個參數(shù)是常量的名稱,第二個參數(shù)就是常量的值。這里需要注意的是,常量的值只能是標(biāo)量類型,也就是數(shù)字、字符串這類的內(nèi)容,不能是變量或者對象類型,因為這類型的內(nèi)容都有隨時改變的可能。

直接使用常量名就可以打印出常量的內(nèi)容,當(dāng)然,我們也可以使用 constant() 這個函數(shù)來獲取常量的內(nèi)容,它可以接收字符串類型的參數(shù)的常量名。

defined() 這個函數(shù)是用于判斷指定的常量是否存在,它只比 define() 函數(shù)多了一個字母 d ,在使用的時候要小心,不要在定義常量的時候多寫了這個 d 哦。

對于接口和類來說,也可以在它們的內(nèi)部使用 const 關(guān)鍵字來定義內(nèi)部常量。

interface A1{
    const TEST = 'Test A1';
}

class A2{
    const TEST = 'Test A2';
}

var_dump(constant('A1::TEST')); // string(7) "Test A1"
var_dump(constant('A2::TEST')); // string(7) "Test A2"

var_dump(defined('A1::TEST')); // bool(true)
var_dump(defined('A2::TEST')); // bool(true)

內(nèi)部常量是有作用域范圍的,它們只在類的內(nèi)部生效。而且在默認(rèn)情況下,這些常量直接就是靜態(tài)類型的,不需要我們再單獨添加 static 關(guān)鍵字。

代碼高亮及文件格式相關(guān)

我們可以使用一個函數(shù),來讓代碼實現(xiàn)高亮的效果。其實也就是給指定的代碼內(nèi)容增加了 code 以及一些格式標(biāo)簽。

var_dump(highlight_string('<?php phpinfo(); ?>'true));
// string(195) "<code><span style="color: #000000">
// <span style="color: #0000BB"><?php phpinfo</span><span style="color: #007700">(); </span><span style="color: #0000BB">?></span>
// </span>
// </code>"

highlight_string() 的第二個參數(shù)是指定返回的類型,如果我們不給這個參數(shù)的話,它的默認(rèn)值是 false ,這樣調(diào)用 highlight_string() 時就會直接輸出而不是將內(nèi)容作為返回值返回。也就是說,像 phpinfo() 這類函數(shù)一樣,它會直接將結(jié)果打印出來。

另外,我們也可以直接對一個文件里面的內(nèi)容進(jìn)行高亮操作。

var_dump(highlight_file('1.PHP中的一些雜項函數(shù)學(xué)習(xí).php'true));
// string(10610) "<code><span style="color: #000000">
// <span style="color: #0000BB"><?php<br /><br /><br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">"A"</span><span style="color: #007700">, </span><span style="color: #DD0000">"Test A"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">); </span><span style="color: #FF8000">// string(6) "Test A"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style=" ……………………………………

var_dump(show_source('1.PHP中的一些雜項函數(shù)學(xué)習(xí).php'true));
// string(10610) "<code><span style="color: #000000">
// <span style="color: #0000BB"><?php<br /><br /><br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">"A"</span><span style="color: #007700">, </span><span style="color: #DD0000">"Test A"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">); </span><span style="color: #FF8000">// string(6) "Test A"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style=" ……………………………………

highlight_file() 函數(shù)的第一個參數(shù)需要的是一個文件的路徑,而第二個參數(shù)的作用就和 highlight_string() 中的第二個參數(shù)的作用是一樣的。另外,highlight_file() 還有一個別名函數(shù)叫做 show_source() 。

除了代碼高亮的功能之外,還有一個函數(shù) php_strip_whitespace() 可以幫助我們直接去掉代碼中的空格和換行以及注釋內(nèi)容。就像壓縮代碼之類的工具一樣。

var_dump(php_strip_whitespace("1.PHP中的一些雜項函數(shù)學(xué)習(xí).php"));
// string(570) "<?php
//  define("A", "Test A"); var_dump(A); var_dump(B); var_dump(constant('A')); var_dump(constant('B')); var_dump(defined('A')); var_dump(defined('B')); interface A1{ const TEST = 'Test A1'; } class A2{ const TEST = 'Test A2'; } var_dump(constant('A1::TEST')); var_dump(constant('A2::TEST')); var_dump(defined('A1::TEST')); …………………………

時間操作函數(shù)

在雜項函數(shù)中,也有一些時間相關(guān)的操作函數(shù),比如系統(tǒng)運行的時間。

echo hrtime(true), PHP_EOL; // 2636292334692
print_r(hrtime());
// Array
// (
//     [0] => 2636
//     [1] => 292338001
// )

在之前的文章中我們其實有講過這個 hrtime() 函數(shù)的作用。它返回的是當(dāng)前操作系統(tǒng)開機到現(xiàn)在經(jīng)過的時間,比如我的電腦是早上開機的,從開機到現(xiàn)在只經(jīng)過了 2636 秒。它返回的是納秒級別的,如果不加那個布爾類型為 true 的參數(shù)的話,它就會以數(shù)組的形式返回,0 下標(biāo)的是秒數(shù),1 下標(biāo)的是納秒數(shù)。而如果加了 true 參數(shù)的話,它就會直接以數(shù)字格式返回整體的秒加上納秒數(shù)。

另外一些時間相關(guān)的函數(shù)就是暫停程序執(zhí)行的一些函數(shù),比如我們經(jīng)常會用到的 sleep() 函數(shù)。

$time = microtime(true);
echo $time, PHP_EOL; // 1609723496.283
sleep(1);
echo microtime(true) - $time, PHP_EOL; // 1.0041399002075
usleep(2000);
echo microtime(true) - $time, PHP_EOL; // 1.0062718391418
time_nanosleep(2100000);
echo microtime(true) - $time, PHP_EOL; // 3.0067868232727
time_sleep_until(time()+3); 
echo microtime(true) - $time, PHP_EOL; // 5.7171077728271

sleep() 是以秒為間隔暫停程序的執(zhí)行。而其它的兩個函數(shù) usleep() 則是以微秒, time_nanosleep() 是以納秒來進(jìn)行暫停的。最后一個 time_sleep_until() 所需要的參數(shù)則是暫停到指定的時間,比如這里我們指定在三秒后暫停,它需要的參數(shù)就是 time() + 3 這個時間戳。當(dāng)然,我們在日常開發(fā)中最常用的還是 sleep() 和 usleep() 。這里大家可以當(dāng)做擴(kuò)充一下知識點,我們 PHP 是可以實現(xiàn)納秒級的暫停的。

生成唯一ID

生成唯一ID這個函數(shù)相信不少同學(xué)也經(jīng)常使用,就是那個 uniqid() 函數(shù)。不過它的原理和參數(shù)你了解嘛?

var_dump(uniqid()); // string(13) "5ff270b0014b4"

var_dump(uniqid('pre_')); // string(17) "pre_5ff270b0014d7"

var_dump(uniqid('pre_'true)); // string(27) "pre_5ff270b0014df3.11521937"

uniqid() 是基于當(dāng)前時間微秒數(shù)來生成唯一ID的,也就說它并不能完全地保證生成的這個 ID 是唯一的。在超大并發(fā)的前提下,很有可能在一微秒內(nèi)就有多個請求到達(dá),所以也是有可能生成多個重復(fù)的 ID 的。

在這種情況,我們可以通過它的參數(shù)來讓生成的 ID 更具有的唯一性。第一個參數(shù)是可以指定生成 ID 的前綴,對于不同的業(yè)務(wù)或者不同的負(fù)載均衡之后的處理機器我們就可以使用不同的前綴來進(jìn)行區(qū)分。第二個參數(shù)則是在返回的字符串結(jié)尾增加額外的熵,它可以進(jìn)一步提升唯一性的可能性。

其它函數(shù)

除了上面介紹的那些比較常見和常用的函數(shù)外,雜項函數(shù)中還包含其它一些不是那么常用的內(nèi)容。

系統(tǒng)負(fù)載

我們可以通過一個函數(shù) sys_getloadavg() 來查看當(dāng)前操作系統(tǒng)的負(fù)載情況,返回的結(jié)果數(shù)組對應(yīng)的就是 Linux 系統(tǒng)中的 1m 、5m 和 15m 的負(fù)載情況。

var_dump(sys_getloadavg());
// array(3) {
//     [0]=>
//     float(2.98828125)
//     [1]=>
//     float(2.4775390625)
//     [2]=>
//     float(2.341796875)
//   }

執(zhí)行代碼

eval() 這個函數(shù)和 JavaScript 中的 eval() 不管名稱還是作用都是一樣的,可以解析并運行一個字符串中的 PHP 代碼。不過需要注意的是,它也是屬于危險函數(shù)哦。要運行的字符串一定是我們自己可控的內(nèi)容,千萬不要運行用戶能夠上傳的內(nèi)容哦。

eval("echo '123', PHP_EOL;"); // 123

退出中斷程序

exit;
die;
exit(0);
exit("End"); // End

exit() 和 die() 不用過多介紹了,它們兩個的作用是一樣的,可以將 die() 看成是 exit() 的別名。如果在沒有參數(shù)的情況下,可以省略不寫后面的括號。而參數(shù)的作用是在中斷程序運行后進(jìn)行輸出。如果參數(shù)是字符串,則直接輸出字符串的內(nèi)容,如果參數(shù)是數(shù)字,則相當(dāng)于是返回程序的運行狀態(tài)碼,和 Linux 中的狀態(tài)碼是一樣的概念。

瀏覽器信息

當(dāng)我們使用瀏覽器訪問的時候,可以通過 get_browser() 函數(shù)來獲得瀏覽器的一些信息。

var_dump(get_browser(nulltrue));
// array(15) {
//     ["browser_name_regex"]=>
//     string(108) "~^mozilla/5\.0 \(.*mac os x 10.15.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*version/14\.0.* safari/.*$~"
//     ["browser_name_pattern"]=>
//     string(88) "Mozilla/5.0 (*Mac OS X 10?15*) applewebkit* (*khtml*like*gecko*) *Version/14.0* Safari/*"
//     ["parent"]=>
//     string(11) "Safari 14.0"
//     ["platform"]=>
//     string(5) "macOS"
//     ["comment"]=>
//     string(11) "Safari 14.0"
//     ["browser"]=>
//     string(6) "Safari"
//     ["browser_maker"]=>
//     string(9) "Apple Inc"
//     ["version"]=>
//     string(4) "14.0"
//     ["majorver"]=>
//     string(2) "14"
//     ["device_type"]=>
//     string(7) "Desktop"
//     ["device_pointing_method"]=>
//     string(5) "mouse"
//     ["minorver"]=>
//     string(1) "0"
//     ["ismobiledevice"]=>
//     string(0) ""
//     ["istablet"]=>
//     string(0) ""
//     ["crawler"]=>
//     string(0) ""
//   }

需要注意的是,這個函數(shù)需要一個 browscap.ini 文件的支持,可以從 http:// 這里下載到 browscap.ini 文件,并在 php.ini 文件中指定 browscap 的路徑到你下載的這個 browscap.ini 文件。這個函數(shù)非常少見,大家了解一下即可。

連接信息

最后就是關(guān)于 PHP 腳本的連接信息的查看,也就是腳本與客戶端的連接信息的查看。

ignore_user_abort(true);
while(1){
    echo " ";
    if (connection_status()!=0){
        ob_start();
        var_dump(connection_aborted());
        $v = ob_get_contents();
        ob_end_flush();
        file_put_contents("1.txt", date("Y-m-d H:i:s") . " Connection aborted! " . $v . PHP_EOL, FILE_APPEND);
        exit;
    }
}

// 1.txt
// 2021-01-04 08:56:22 Connection aborted! int(1)

ignore_user_abort() 函數(shù)用于設(shè)置客戶端斷開連接時是否中斷腳本的執(zhí)行,當(dāng)我們訪問這個測試頁面后,馬上在瀏覽器上關(guān)閉它,就會觸發(fā)這個函數(shù)。

下面的無限循環(huán)代碼是用于監(jiān)控當(dāng)前連接的狀態(tài),使用的是 connection_status() 這個函數(shù),當(dāng)它的值為 0 時,也就是 CONNECTION_NORMAL 這個狀態(tài)是屬于正常連接的狀態(tài),而當(dāng)它不為 0 的時候,我們就記錄到一個日志文件中。connection_aborted() 是判斷連接是否中斷的函數(shù),這是一個直接輸出流的函數(shù),我們需要通過 輸入輸出流 來捕獲它的內(nèi)容。

最后,當(dāng)瀏覽器關(guān)閉的時候,連接相關(guān)的內(nèi)容就記錄到了 1.txt 這個文件中。我們可以查看這個文件里面的信息。

總結(jié)

怎么樣,今天的內(nèi)容雖然是 PHP 文檔中的雜項擴(kuò)展,而且內(nèi)容也確實很雜,但它們有不少內(nèi)容確實是我們經(jīng)常使用的。掌握好它們,擴(kuò)寬自己的眼界,總有一天這些內(nèi)容會為你帶來福報,加油吧,打工人。

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/1.PHP中的一些雜項函數(shù)學(xué)習(xí).php

參考文檔:

https://www./manual/zh/book.misc.php

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多