goodCoder

1.unset的使用

<?php
    /*
     *unset() 函數用於銷燬給定的變量。
     * 如果 unset() 一個通過引用傳遞的變量,則只是該變量被銷燬,而在調用環境中的變量將保持調用 unset() 之前一樣的值。
     */
    $test = 'aaaaaa';
    $abc = &$test;
    unset($test);
    echo $test;
    echo $abc;
    
    
    /*
     * 輸出結果:aaaaaa
     *
     */

2.自動加載文件函數

 <?php

//自動加載函數:__autoload()

function __autoload($class){
    include 'lib/'.$class.'.class.php';
}
$User=new User();
/**
 * 解釋:當實例化一個對象時,會在本頁面查找有沒有匹配的類,如果沒有,會自動執行__autoload()方法,同時會把類的名稱傳給__autoload()這個方法,
 * 這樣就可以引入與之匹配的類文件了(前提是類文件存在這個目錄中)
 */

//自定義函數來加載類文件:spl_autoload_register()

function A($class){
    include 'lib/'.$class.'.class.php';
}
spl_autoload_register('A');
$User= new User();
/**
 * 解釋:與上一個相同,也是先查找當前文件有沒有匹配的類,然後再去執行自定義加載的函數,不同的是,
 * 如果與__autoload()同時存在的話,__autoload()不會被執行
 */

//自定義對象加載類文件:通過spl_autoload_register(array('對象','方法名稱'))來實現

class A{
    public function Aauto($class){
        include 'lib/'.$class.'.class.php';
    }
}
$A=new A();
sql_autoload_register(array($A,'Aauto'));
$User= new User();

//指定靜態方法加載類文件:spl_autoload_register(array('類名','靜態方法名稱'))來實現(兩種寫法)

//第一種:

class B{
    public function Aauto($class){
        include 'lib/'.$class.'.class.php';
    }
}
sql_autoload_register(array('A','Aauto'));
$User= new User();
//第二種:

class C{
    public function Aauto($class){
        include 'lib/'.$class.'.class.php';
    }
}
sql_autoload_register(array('A::Aauto'));
$User= new User();

3.等號的比較

/*

雖然 PHP 是弱類型語言,但也需要明白變量類型及它們的意義,因爲我們經常需要對 PHP 變量進行比較,包含鬆散和嚴格比較。
鬆散比較:使用兩個等號 == 比較,只比較值,不比較類型。
嚴格比較:用三個等號 === 比較,除了比較值,也比較類型。

*/

<?php
echo '0 == false: ';
var_dump(0 == false);
echo '0 === false: ';
var_dump(0 === false);
echo PHP_EOL;
echo '0 == null: ';
var_dump(0 == null);
echo '0 === null: ';
var_dump(0 === null);
echo PHP_EOL;
echo 'false == null: ';
var_dump(false == null);
echo 'false === null: ';
var_dump(false === null);
echo PHP_EOL;
echo '"0" == false: ';
var_dump("0" == false);
echo '"0" === false: ';
var_dump("0" === false);
echo PHP_EOL;
echo '"0" == null: ';
var_dump("0" == null);
echo '"0" === null: ';
var_dump("0" === null);
echo PHP_EOL;
echo '"" == false: ';
var_dump("" == false);
echo '"" === false: ';
var_dump("" === false);
echo PHP_EOL;
echo '"" == null: ';
var_dump("" == null);
echo '"" === null: ';
var_dump("" === null);

/*
運行結果:
   0 == false: bool(true)
0 === false: bool(false)

0 == null: bool(true)
0 === null: bool(false)

false == null: bool(true)
false === null: bool(false)

"0" == false: bool(true)
"0" === false: bool(false)

"0" == null: bool(false)
"0" === null: bool(false)

"" == false: bool(true)
"" === false: bool(false)

"" == null: bool(true)
"" === null: bool(false)
*/

4.打印斐波那鍥數

<?php
/*
 * 請打印斐波那契數列10個, 1,1,2,3,5……(遞歸、循環)
 *
 *
 */

//循環
function F1($n)
{
    $f1 = 1;
    $f2 = 1;
    if($n<=2){
        return 1;
    }
    for ($i = 3; $i <= $n; $i++) {
       $f3=$f1+$f2;
       $f1=$f2;
       $f2=$f3;
    }
    return $f3;
}
//遞歸
function F2($n){
    if($n<=2){
        return 1;
    }
    return F2($n-1)+F2($n-2);
}

echo F1(10);//55
echo F2(10);//55

<?php
//矩陣相乘
function multi($arr1,$arr2){
    for($i=0;$i<2;$i++){
        for($j=0;$j<2;$j++){
            $ret[$i][$j]=0;
            for($k=0;$k<2;$k++){
                $ret[$i][$j]+=$arr1[$i][$k]*$arr2[$k][$j];
            }
        }
    }
    return $ret;
}
//快速冪
function myPow($arr,$n){
    $ret=array(0=>array(1,1),
        1=>array(1,1));
    while($n!=0){
        if($n&1){
            $ret=multi($ret,$arr);
        }
        $arr=multi($arr,$arr);
        $n>>=1;
    }
    //處理矩陣
    return $ret[0][0]+$ret[0][1];
}
$n=5;
$arr=array(0=>array(1,1),
           1=>array(1,0));
echo myPow($arr,$n-3);

5.判斷類型的函數

<?php
/*
 *isset($val), empty($val),boolval($val), intval($val)
 *$val == false , $val === false, $val == null 的區別,且編寫代碼Demo說明。
 *
 * isset() 函數用於檢測變量是否已設置並且非 NULL。如果已經使用 unset() 釋放了一個變量之後,再通過 isset() 判斷將返回 FALSE。
 *若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE。同時要注意的是 null 字符("\0")並不等同於 PHP 的 NULL 常量。
 *
 * empty() 函數用於檢查一個變量是否爲空。當一個變量並不存在,或者它的值等同於 FALSE,那麼它會被認爲不存在。如果變量不存在的話,empty()並不會產生警告。
 *empty() 5.5 版本之後支持表達式了,而不僅僅是變量。
 *
 * boolval() 函數用於獲取變量的布爾值。
 *
 * intval() 函數用於獲取變量的整數值。通過使用指定的進制 base 轉換(默認是十進制),返回變量 var 的 integer 數值。
 * intval() 不能用於 object,否則會產生 E_NOTICE 錯誤並返回 1。
 *
*/
 $a;
 echo "1.".isset($a);//false
 $a=null;
 echo "2.".isset($a);//false
 $a=1;
 echo "3.".isset($a);//true
 unset($a);
 echo "4.".isset($a);//false
 $a="\0";
 echo "5.".isset($a);//true


$ivar1=0;
$istr1='Runoob';
if (empty($ivar1))
{
    echo '$ivar1' . " 爲空或爲 0。" . PHP_EOL;//輸出
}
else
{
    echo '$ivar1' . " 不爲空或不爲 0。" . PHP_EOL;
}
if (empty($istr1))
{
    echo '$istr1' . " 爲空或爲 0。" . PHP_EOL;
}
else
{
    echo '$istr1' . " 字符串不爲空或不爲0。" . PHP_EOL;//輸出
}

echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";//false
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";//true
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";//false
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";//true
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";//false
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";//true
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";//false
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";//true
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";//true
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";//false


echo intval(10.0);//10
echo intval(10);//10
echo intval(10.5);//10
echo intval(0.01);//0

6.引用的基本使用

<?php
/**
 * php傳值:在函數範圍內,改變變量值得大小,都不不會影響到函數外邊的變量值。
 * PHP按引用:在函數範圍內,對值的任何改變,在函數外部也有所體現,因爲傳引用傳的是內存地址。
 */
function get_arr_ref(&$arr){
    unset($arr[0]);
}
function get_arr($arr){
    unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr_ref($arr1);
get_arr($arr2);
echo count($arr1)."\n";//1
echo count($arr2)."\n";//2

7.請寫一個函數,將一個長度超過10 的數組最後5項直接截取,不改變順序變爲前5項

<?php
/**
 * 請寫一個函數,將一個長度超過10 的數組最後5項直接截取,不改變順序變爲前5項
 *   如{1,2,3,4,5,6,7,8,9,10}變爲{6,7,8,9,10,1,2,3,4,5}。
 */

function arrsort($arr){

    $num = count($arr);
    if($num > 5){
        //array_slice() 函數返回數組中的選定部分。
        $arr_firstpart = array_slice($arr,$num-5);
        $arr_lastpart = array_slice($arr,0,($num-5));
    }else{

        return $arr;
    }
    //將兩個數組合並
    $arr_new = array_merge($arr_firstpart,$arr_lastpart);
    return $arr_new;
}
 $arr=array(1,2,3,4,5,6,7,8,9,0);
 print_r(arrsort($arr));

8.求數組中最大數的下標

<?php
/**
 * 求數組中最大數的下標。
 */
function maxIndex($arr){

    $max=0;
    $count=count($arr);
    for($i=0;$i<$count;$i++){
        if($arr[$i]>$arr[$max]){
            $max=$i;
        }
    }
    return $max;
}

$arr=array(10,9,100,3,5,1);
echo maxIndex($arr);//2

9.類

<?php
/**
 * PHP實現類繼承:要求有基類普通訂單,包含屬性訂單類型(orderType)、方法打印訂單信息(打印類型-單號)、Q3所述方法,
 * 子類有外賣訂單,商超訂單,質享訂單,並覆蓋基類屬性、方法。要求正確使用abstract、final。
 *
 */
abstract class jOrder{

    public $orderType;//訂單類型
    public $orderInfo;//打印類型


    /*
       *
       *返回字符串的毫秒數時間戳
       */
   final function get_total_millisecond()
    {
        $time = explode (" ", microtime () );
        $time = $time [1] . ($time [0] * 10000);
        $time2 = explode ( ".", $time );
        $time = $time2 [0];
        return $time;
    }
    function createOrderId(){
        srand(time());
        $orderId=get_total_millisecond();
        echo $orderId."\n";
        $orderId.=(rand()%10).(rand()%10);
        return $orderId;
    }

    function fugai(){
       echo "我是父類";
    }
    abstract function ask();


}
//外面訂單
class pOrder extends jOrder{

    function fugai()
    {
        parent::fugai(); // TODO: Change the autogenerated stub
        echo "我是子類--外面訂單";
    }

    function ask()
    {
        // TODO: Implement ask() method.
        echo "hello";
    }
}
//商超訂單
class sOrder extends jOrder{

    function fugai()
    {
        parent::fugai(); // TODO: Change the autogenerated stub
        echo "我是子類--商超訂單";
    }
    function ask()
    {
        // TODO: Implement ask() method.
        echo "hi";
    }
}
//質享訂單
class zOrder extends jOrder{

    function fugai()
    {
        parent::fugai(); // TODO: Change the autogenerated stub
        echo "我是子類--質享訂單";
    }
    function ask()
    {
        // TODO: Implement ask() method.
        echo "你好";
    }
}

$t1=new pOrder(1,"菜");
$t1->fugai();
$t1->ask();

10.生成訂單號

<?php
/*
 * 假設訂單號生成規則:10位時間戳+4位毫秒+2位隨機數。已知函數isExist($orderId)可以判斷訂單號是否已經存在,重複可重新生成。
 * 寫一個生成訂單號的函數createOrderId()。
 *
 */

function createOrderId(){
    srand(time());
    $orderId=get_total_millisecond();
    echo $orderId."\n";
    $orderId.=(rand()%10).(rand()%10);
    return $orderId;
}
/*
    *
    *返回字符串的毫秒數時間戳
    */
function get_total_millisecond()
{
    $time = explode (" ", microtime () );
    $time = $time [1] . ($time [0] * 10000);
    $time2 = explode ( ".", $time );
    $time = $time2 [0];
    return $time;
}

$orderId=0;
if(empty($orderId)){
    echo createOrderId();
}else{
    echo $orderId;
}

11.模擬get()/post()方法

<?php
/**
 * fopen() 函數打開文件或者 URL,如果打開失敗,本函數返回 FALSE。
 *語法:fopen(filename,mode,include_path,context)
       filename	必需。規定要打開的文件或 URL。
       mode	必需。規定要求到該文件/流的訪問類型。可能的值見下表。
       include_path	可選。如果也需要在 include_path 中檢索文件的話,可以將該參數設爲 1 或 TRUE。
       context	可選。規定文件句柄的環境。Context 是可以修改流的行爲的一套選項。
 * 參考鏈接:https://www.w3school.com.cn/php/func_filesystem_fopen.asp
 *
 * fread() 函數讀取打開的文件。函數會在到達指定長度或讀到文件末尾(EOF)時(以先到者爲準),停止運行。該函數返回讀取的字符串,如果失敗則返回 FALSE。
 *語法:string fread ( resource $handle , int $length )
        handle	文件系統指針,是典型地由 fopen() 創建的 resource(資源)。
        length	必需。規定要讀取的最大字節數。
 * 參考鏈接:https://www.runoob.com/php/func-filesystem-fread.html
 *
 * file_get_contents() 把整個文件讀入一個字符串中。該函數是用於把文件的內容讀入到一個字符串中的首選方法。如果服務器操作系統支持,還會使用內存映射技術來增強性能。
 * 語法:file_get_contents(path,include_path,context,start,max_length)
        path	必需。規定要讀取的文件。
        include_path	可選。如果您還想在 include_path(在 php.ini 中)中搜索文件的話,請設置該參數爲 '1'。
        context	可選。規定文件句柄的環境。context 是一套可以修改流的行爲的選項。若使用 NULL,則忽略。
        start	可選。規定在文件中開始讀取的位置。該參數是 PHP 5.1 中新增的。
        max_length	可選。規定讀取的字節數。該參數是 PHP 5.1 中新增的。
 *
 */

//$file=fopen("https://www.runoob.com/php/func-filesystem-fread.html","r");
//$ret=fread($file,10);
//echo $ret;
//$res=file_get_contents("https://www.runoob.com/php/func-filesystem-fread.html");
//echo $res;
//fclose($file);

/**
 * http_build_query()就是將一個數組轉換成url 問號?後面的參數字符串,並且會自動進行urlencode處理。
 * 參考鏈接:http://www.nowamagic.net/librarys/veda/detail/2585
 *
 *stream_context_create() 是用來創建打開文件的上下文件選項的,比如用POST訪問等
 */

//post方法
$data = array(
    'foo'=>'bar',
    'baz'=>'boom',
    'site'=>'www.nowamagic.net',
    'name'=>'nowa magic');

$data = http_build_query($data);//foo=bar&baz=boom&site=www.nowamagic.net&name=nowa+magic
$options = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type:application/x-www-form-urlencoded',//post向服務器提交數據的一種方式
        'content' => $data,//提交的內容
        'timeout' => 60 * 60 // 超時時間(單位:s)
    )
);

$url = "http://www.nowamagic.net/librarys/veda/detail/2585";
http://www.nowamagic.net/librarys/veda/detail/2585
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;

//get方法
$url = "http://www.nowamagic.net/librarys/veda/detail/2585";
$result=file_get_contents($url);
echo $result;

12.三種輸出方法的比較

<?php

//echo輸出練習
echo "<h2>PHP 很有趣!</h2>";
echo "Hello world!<br>";
echo "我要學 PHP!<br>";
echo "這是一個", "字符串,", "使用了", "多個", "參數。";

//echo輸出變量練習
$txt1="學習 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");
echo $txt1;
echo "<br>";
echo "在 $txt2 學習 PHP ";
echo "<br>";
echo "我車的品牌是 {$cars[0]}";

//print輸出練習
print "<h2>PHP 很有趣!</h2>";
print "Hello world!<br>";
print "我要學習 PHP!";

//print輸出變量練習
$txt1="學習 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");

print $txt1;
print "<br>";
print "在 $txt2 學習 PHP ";
print "<br>";
print "我車的品牌是 {$cars[0]}<br>";

//print_r輸出
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x','y','z'));
print_r ($a);
$b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r ($b, true); // $results 包含了 print_r 的輸出結果

13.字符串反轉

<?php
/**
 * 請自己寫一個函數,實現字符串的反轉。
 *
 */

/*
 * substr(string,start,length);函數返回字符串的一部分.
 *        string	必需。規定要返回其中一部分的字符串。
 *        start	    必需。規定在字符串的何處開始。
 *                  正數 - 在字符串的指定位置開始
 *                  負數 - 在從字符串結尾開始的指定位置開始
 *                  0 - 在字符串中的第一個字符處開始
 *       length	   可選。規定被返回字符串的長度。默認是直到字符串的結尾。
 *                 正數 - 從 start 參數所在的位置返回的長度
 *                 負數 - 從字符串末端返回的長度
 *
 *
 * mb_substr — 獲取部分字符串
 *      作用和substr一致,不同的是多了一個字符編碼的參數
 */

//方法一:遞歸實現
function reverse1($str)
{
    if (strlen($str) <= 1) return $str;
    $ret = '';
    $ret .= substr($str,-1).reverse1(substr($str,0,strlen($str)-1));
    return $ret;
}

//方法二
function reverse2($str){
    $sz=strlen($str);
    if($sz<=1)return $str;
    $ret="";
    for($i=$sz-1;$i>=0;$i--){
        $ret=$ret.$str[$i];
    }
    return $ret;
}

//前兩個方法碰到漢字會亂碼
//方法三
function reverse3($str,$encoding='utf-8'){
    $ret = '';
    $sz = mb_strlen($str);
    for($i=$sz-1; $i>=0; $i--){
        $ret .= mb_substr($str,$i,1,$encoding);
    }
    return $ret;
}

$str="ni haoya";
$str1="你好";
echo reverse1($str);
echo reverse3($str1);

/*
 * 運行結果
 * ayoah in
 * 好你
 */

14. 將數組用一行拼裝成一個字符串

<?php
/**
 * 將下面的數組用一行拼裝成一個字符串 i am qa ! day day up!
 *
 */
$arr = array(
    'I', 'AM', 'QA!', 'DAY', 'DAY', 'UP!'
);
$count=count($arr);
$str="";
for($i=0;$i<$count;$i++){
    $str.=$arr[$i];
}
echo $str;

15.static 關鍵字用法

<?php

/*
 * static修飾靜態變量,在函數中使用時,會改變變量的生命週期,但是不會改變變量的作用域
 */
$count = 5;
function get_count(){
    static $count = 0;
    return $count++;
}
echo $count;//5
++$count;
echo get_count();//0
echo get_count();//1
echo get_count();//2

16.遍歷目錄

<?php
/**
 * 請寫一個函數遍歷目錄下的所有文件和文件夾。
 */
$filePath  = array();//文件路徑數組
function traverse($path = '.') {
    global $filePath;//得到外部定義的數組
    $current_dir = opendir($path);    //opendir()返回一個目錄句柄,失敗返回false
    while(($file = readdir($current_dir)) !== false) {    //readdir()返回打開目錄句柄中的一個條目,成功則返回文件名 或者在失敗時返回 FALSE
        $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //構建子目錄路徑
        if($file == '.' || $file == '..') {
            continue;
        }else if(is_dir($sub_dir)) {    //如果是目錄,進行遞歸
            echo 'Directory ' . $file . ':';  //如果是文件夾,輸出文件夾名稱
            traverse($sub_dir); //嵌套遍歷子文件夾
        }else{    //如果是文件,直接輸出路徑和文件名
            echo 'File in Directory ' . $path . '/' . $file .'<br/>';
            $filePath[$path . '/' . $file] = $path . '/' . $file;//把文件路徑賦值給數組
        }
    }
    return $filePath;
}
$array = traverse("E:\untitled1");
print_r($array);

17.獲取url中文件後綴

<?php
/*
 * 請寫一個函數,儘可能高效的,從一個標準 url裏取出文件的擴展名。
 *
 * 一個標準url包含什麼?
 * 答:模式(或稱協議)、服務器名稱(或IP地址)、路徑和文件名,如:http://www.baidu.com/abc/de/fg.php?id=1
 *
 *  在php預定義函數中有一個叫做"pathinfo()"的函數,以數組的形式返回關於文件路徑的信息。
 *  返回的數組元素如下:
 *  [dirname]: 目錄路徑
 *  [basename]: 文件名
 *  [extension]: 文件後綴名
 *  [filename]: 不包含後綴的文件名
 *  pathinfo($url_path,[option_info])
 *           $url_path: URL的路徑(字符串形式)
 *           [option_info]:其他可選參數(PATHINFO_DIRNAME,PATHINFO_BASENAME,PATHINFO_EXTENSION)
 */
     $url_path="http://www.baidu.com/abc/de/fg.php?id=1";
    //方法一
     $result=pathinfo($url_path,PATHINFO_EXTENSION);
     $result=explode('?',$result);
     echo $result[0]."\n";//php

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章