PHP被忽略的基礎知識

[TOC]php

持續更新,記錄一些值得關注的問題。mysql

下列PHP配置項中,哪個和安全最不相關:()

A. open_basedir
B. register_globals
C. disable_functions
D. file_uploads

open_basedir 可將用戶訪問文件的活動範圍限制在指定的區域 ,一般是其家目錄的路徑,也 可用符號 "." 來表明當前目錄。注意用 open_basedir 指定的限制其實是前綴 , 而不是目錄名。 舉例來講 : 若 "open_basedir = /dir/user", 那麼目錄 "/dir/user" 和 "/dir/user1" 都是 能夠訪問的。因此若是要將訪問限制在僅爲指定的目錄,請用斜線結束路徑名。例如設置成 : "open_basedir = /dir/user/"sql

register_globals 的意思就是註冊爲全局變量 ,因此當 On 的時候,傳遞過來的值會被直接的註冊爲全局變量直接使用,而 Off 的時候,咱們須要到特定的數組裏去獲得它。 1.PHP 4.2.0 版開始配置文件中 register_globals 的默認值從 on 改成 off 了,雖然你能夠設置它爲 On ,可是當你沒法控制服務器的時候,你的代碼的兼容性就成爲一個大問題,因此,你最好從如今就開始用 Off 的風格開始編程。 2. 當 register_globals 打開之後,各類變量都被注入代碼,例如來自 HTML 表單的請求變量。再加上 PHP 在使用變量以前是無需進行初始化的,這就使得更容易寫出不安全的代碼。 當打開時,人們使用變量時確實不知道變量是哪裏來的,只能想固然。可是 register_globals 的關閉改變了這種代碼內部變量和客戶端發送的變量混雜在一塊兒的糟糕狀況。shell

disable_functions 限制程序使用一些能夠直接執行系統命令的函數 ,如 system , exec , passthru , shell_exec , proc_open 等等。因此若是想保證服務器的安全,請將這個函數加到 disable_functions 裏或者將安全模式打開吧數據庫

file_uploads , PHP 文件上傳功能記錄 file_uploads 指令決定是否啓用,默認值: On 。編程

字符串比較函數

如下程序運行結果:( )數組

<?
          $str = "LAMP";
          $str1 = "LAMPBrother";
          $strc = strcmp($str,$str1);
          switch ($strc){
                 case 1:
                        echo "str > str1";
                        break;
                 case –1:
                        echo "str < str1";
                        break;
                 case 0:
                        echo "str = str1";
                        break;
                 default:
                        echo "str <> str1";
          }
   ?>
   
A. str > str1
B. str < str1
c. str = str1
D. str <> str1

strmp($str1,$str2)函數的意思,比較兩個字符串的大小,比較時計算了兩個字符串相差(不一樣)字符的個數一塊兒做爲返回。結果是-7。安全

格林時間

代碼運行後的輸出結果爲( )服務器

<?php
   $d=mktime(9, 12, 31, 6, 10, 2015);
    echo "建立日期是 " . date("Y-m-d h:i:sa", $d);

A. 建立日期是 2015-06-10 09:12:31amide

B. 建立日期是 2015-10-06 09:12:31am

C. 建立日期是 2015-10-6 9:12:31am

D. 建立日期是 2015-10-06 09:12:31pm

mktime — 取得一個日期的 Unix 時間戳;  即:時,分,秒,月,日,年。
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int$month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

在PHP面向對象中,下面關於final修飾符描述錯誤的是( )

A. 使用final標識的類不能被繼承

B. 在類中使用final標識的成員方法,在子類中不能被覆蓋

C. 不能使用final標識成員屬性

D. 使用final標識的成員屬性,不能在子類中再次定義

PHP 5 新增了一個 final 關鍵字。若是父類中的方法被聲明爲 final,則子類沒法覆蓋該方法。若是一個類被聲明爲 final,則不能被繼承。
Note: 屬性不能被定義爲 final,只有類和方法才能被定義爲 final。

getdate()函數返回的值的數據類型是:( )

A. 整形 B. 浮點型 C. 數組 D. 字符串

調用getdate函數的返回值
Array ( [seconds] => 37 [minutes] => 34 [hours] => 15 [mday] => 19 [wday] => 3 [mon] => 8 [year] => 2015 [yday] => 230 [weekday] => Wednesday [month] => August [0] => 1439969677 )

關於mysql_pconnect說法正確的是?( )

A. 與數據庫進行多鏈接 B. 與mysql_connect功能相同 C. 與@mysql_connect功能相同 D.與數據庫創建持久鏈接

mysql_pconnect() 函數打開一個到 MySQL 服務器的持久鏈接。

mysql_pconnect() 和 mysql_connect() 很是類似,雖然只多了一個P, 但有兩個主要區別:

當鏈接的時候本函數將先嚐試尋找一個在同一個主機上用一樣的用戶名和密碼已經打開的(持久)鏈接,若是找到,則返回此鏈接標識而不打開新鏈接。其次,當腳本執行完畢後到 SQL 服務器的鏈接不會被關閉,此鏈接將保持打開以備以 後使用( mysql_close() 不會關閉由 mysql_pconnect() 創建的鏈接)

請看代碼,數據庫關閉指令將關閉哪一個鏈接標識?( )

<?php
       $link1 =mysql_connect("localhost","root","");
       $link2 = mysql_connect("localhost","root","");
       mysql_close();
   ?>

A. $link1 B. $link2 C. 所有關閉 D. 報錯

【就近原則】
mysql_close() 關閉指定的鏈接標識所關聯的到 MySQL 服務器的非持久鏈接。
若是沒有指定 link_identifier,則關閉上一個打開的鏈接。

bool mysql_close ([ resource $link_identifier = NULL ] )

值引用

閱讀下面代碼,解答輸出。

<?php
$data = ['a','b','c'];

foreach ($data as $k => &$v){
    //
    
}

var_dump($data);


foreach ($data as $k => $v){
    //
    
}

var_dump($data);

第一次輸出 ['a','b','c']

第二次輸出 ['a','b','b']

第一次遍歷運用引用 $v的地址指向數組最後一個位置,即c的位置;

第二次遍歷將值賦給$v,值a賦給$v,指向c,此時a[2]=a;執行到第二個元素,b賦給$v,賦給$v指向地址a[2],此時數組a[2]=b;執行到第3個元素,此時a[2]=b,b賦給$v,賦給$v指向地址,此時數組a[2]=b

static、self

閱讀代碼,給出解答。

<?php

class A{
    
    public static function who(){
        
        echo __CLASS__;
        
    }
    
    
    public static function test(){
        
        static::who();
        
    }
    
     public static function test2(){
            
        self::who();
     }
}


class B extends A{
    
    public static function who(){
        echo __CLASS__;
    }
}

B::test();    //B  static指向調用方B,用於後期靜態綁定,也能夠稱之爲「靜態綁定」,由於它能夠用於(但不限於)靜態方法的調用。
B::test2();   //A  self指向其定義所在類

自 PHP 5.3.0 起,PHP 增長了一個叫作後期靜態綁定的功能,用於在繼承範圍內引用靜態調用的類。 當進行靜態方法調用時,該類名即爲明確指定的那個(一般在 :: 運算符左側部分);當進行非靜態方法調用時,即爲該對象所屬的類 ------摘自php.net

後期靜態綁定本想經過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字可以讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。 最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。 ------摘自php.net

static使用另一種狀況:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 後期靜態綁定從這裏開始
    }
}

class B extends A {

}
?>

B::test();   // A 由於B類中沒有who方法,因此不得不又調用A類中的who方法。

閱讀代碼,給出解答。

<?php
class A {
    public static function  who(){
        
        echo __CLASS__;
        
    }
  
}


class B extends A {
    
    public static function who(){
        
        echo __CLASS__;
        
    }
    
     
}

class C extends B{
    public function who(){
        
        echo __CLASS__;
        
    }
    
     public static function test(){
            A::who();     //A
            parent::who();  //B
            self::who();    //C
            static::who();  //C
        }
}

C::test();

static做用

<?php

$a = 0 == 'abc' ?5:1;
function test(){
    static $a=1;
    return $a++;
}

echo $a;        //5
echo ++$a;      //6
echo test();    //1
echo test();    //2

靜態局部變量的特色:

  1. 不會隨着函數的調用和退出而發生變化,不過,儘管該變量還繼續存在,但不能使用它。假若再次調用定義它的函數時,它又可繼續使用,並且保存了前次被調用後留下的值;
  2. 靜態局部變量只會初始化一次;
  3. 靜態屬性只能被初始化爲一個字符值或一個常量,不能使用表達式。即便局部靜態變量定義時沒有賦初值,系統會自動賦初值0(對數值型變量)或空字符(對字符變量);靜態變量的初始值爲0。
  4. 當屢次調用一個函數且要求在調用之間保留某些變量的值時,可考慮採用靜態局部變量。雖然用全局變量也能夠達到上述目的,但全局變量有時會形成意外的反作用,所以仍以採用局部靜態變量爲宜。

usort 自定義排序

usort ( array &$array , callable $value_compare_func ) : bool

callback ( mixed $a, mixed $b ) : int

在第一個參數小於,等於或大於第二個參數時,該比較函數必須相應地返回一個小於,等於或大於 0 的整數

<?php
  $data = [3, 2, 5, 6, 1];

        usort($data,function($a,$b){
            return $a<=>$b;
        });


        $data = [
            ['id' => 2, 'name'=> 'sun'],
            ['id' => 1, 'name'=> 'c'],
            ['id' => 9, 'name'=> 'b'],
            ['id' => 6, 'name'=> 'g'],
        ];

        usort($data,function($a,$b){
            return $a['id']<=>$b['id'];
        });

        var_dump($data);

glob

glob — 尋找與模式匹配的文件路徑

glob ( string $pattern [, int $flags = 0 ] ) : array
<?php

glob('./*Ctroller.php');  //模糊匹配當前目錄全部控制器文件
相關文章
相關標籤/搜索