PHP

PHP

標(biāo)簽(空格分隔): 面試


PHP的引用變量的概念及定義

延伸: PHP引用變量的原理

概念:
在 PHP 中 引用意味著用不同的名字訪問(wèn)同一個(gè)變量的內(nèi)容

定義方式:
使用&符號(hào)

PHP引用變量的工作原理

$a=range(0,1000);

//定義變量b,將a變量的值賦值給b
//COW機(jī)制 (Copy On Write)
$b=$a;

//對(duì)a進(jìn)行修改才會(huì)copy
$a=range(0,1000);

//驗(yàn)證COW機(jī)制可以使用函數(shù)memory_get_usage()
//在每個(gè)表達(dá)式后面讀取內(nèi)存量

//而引用賦值不遵從COW機(jī)制,永遠(yuǎn)指向一個(gè)內(nèi)存空間

zval結(jié)構(gòu)體

//zval變量容器
$a=range(0,3);
xdebug_debug_zval('a');

//定義變量b,把a(bǔ)的值賦值給b
$b= $a;
xdebug_debug_zval('a');

//修改a
$a=range(0,3);
xdebug_debug_zval('a');

unset 對(duì)引用變量的影響

unset只會(huì)取消引用,不會(huì)銷毀空間

$a=1;
$b=&$a;

unset($b);

echo $a."\n";  //此時(shí)$a還存在值,證明只是取消$b的引用

對(duì)象不會(huì)復(fù)制空間,不遵守COW
對(duì)象本身就是引用傳遞

class Person{
    public $name='zhangsan';
}

$p1=new Person;
xdebug_debug_zval('p1');

$p2=$p1;
xdebug_debug_zval('p1');

$p2->name='lisi';
xdebug_debug_zval('p1'); //此時(shí)并沒(méi)有開(kāi)辟出一個(gè)新空間,clone對(duì)象才可以

真題

//真題

/**
 * TODO 寫出如下程序的輸出結(jié)果
 *
 */
$data=['a','b','c'];

foreach($data as $key => $val){
    $val=&$data[$key];
    var_dump($data);
}

var_dump($data);
/**
 * TODO 程序運(yùn)行時(shí),每一次循環(huán)結(jié)束后變量$data的值是什么?請(qǐng)解釋
 * TODO 程序執(zhí)行完成后,變量$data的值是什么?請(qǐng)解釋
 */

常量及數(shù)據(jù)類型考點(diǎn)

PHP中字符串可以使用哪三種定義方法以及各自的區(qū)別是什么?

  1. 定義方式: 單引號(hào),雙引號(hào),heredoc和nowdoc

heredoc 和 nowdoc (看看)

$a='sdsd';

$str="abcdsd '{$a}'"; //會(huì)被解析變量,并且單引號(hào)會(huì)原樣輸出
echo $str;

單引號(hào)比雙引號(hào)更快,建議寫單引號(hào)

  • heredoc類似雙引號(hào)
  • nowdoc類似雙引號(hào)
  • 兩者都是用來(lái)處理大文本

知識(shí)點(diǎn)延伸

  1. 數(shù)據(jù)類型考點(diǎn)
    • 8 大 3 類
    • 標(biāo)量,復(fù)合,特殊
  2. 浮點(diǎn)類型
    • 浮點(diǎn)類型不能運(yùn)用到比較運(yùn)算中[???],感覺(jué)是比較運(yùn)算當(dāng)做判斷條件

      $a=0.1;
      

$b=0.5;

    echo $a+$b.PHP_EOL;

    $c=$a+$b == 0.6 ? true:false;

var_dump($c); //為true,不知道為什么
```

    ```php
    $a=0.1;

$b=0.7;
if($a+$b == 0.8) { //用于條件判斷時(shí)出錯(cuò)
echo 'haha';
}else{
echo '5555';
}
```

  1. 比較浮點(diǎn)類型可以用php內(nèi)置函數(shù) bccomp()

  2. 布爾值

    • false: 0,0.0,'','0',false,array(),null
  3. 數(shù)組類型:

    • 超全局?jǐn)?shù)組:
      $GLOBALS,$_GET, $_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILES,$_ENV
  4. NULL

    • 三種情況: 直接賦值為null,未定義的變量,unset銷毀的變量

常量

  1. 預(yù)定義常量

    • _FILE,_LINE,_DIR,_FUNCTION,_CLASS,_TRAIT,_METHOD,_NAMESPACE
  2. 定義方式
    const,define

const更快,是語(yǔ)言結(jié)構(gòu)
define是函數(shù)

  1. define不能用于類常量的定義,const可以

  2. 常量一經(jīng)定義,不能被修改,不能被刪除

真題

用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼
FILE表示什么意思?

運(yùn)算符

foo()和@foo()之間區(qū)別

  1. 考點(diǎn):PHP的運(yùn)算符的錯(cuò)誤控制符@
  2. 延伸:
    • PHP所有運(yùn)算符考點(diǎn)
    • 運(yùn)算符的優(yōu)先級(jí)
    • 比較運(yùn)算符
    • 遞增遞減運(yùn)算符
    • 邏輯運(yùn)算符

PHP的錯(cuò)誤運(yùn)算符

PHP 支持一個(gè)錯(cuò)誤運(yùn)算符: @.
當(dāng)將其放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉

延伸考點(diǎn): PHP運(yùn)算符優(yōu)先級(jí)

遞增/遞減 > ! > 算數(shù)運(yùn)算符 > 大小比較 > (不)相等比較 > 引用 > 位運(yùn)算符(^) > 位運(yùn)算符(|) > 邏輯與 > 邏輯或 > 三目 > 賦值 > and > xor > or

  • 括號(hào)的使用可以增加代碼可讀性

延伸考點(diǎn): 比較運(yùn)算符

  1. == 和 === 的區(qū)別
  2. 等值判斷(FALSE的七種情況) ==> 前面說(shuō)過(guò)布爾值那里

延伸考點(diǎn): 遞增/遞減運(yùn)算符

  1. 遞增/遞減運(yùn)算符不影響布爾值 ==> ++/-- 不改變布爾值
  2. 遞減NULL值沒(méi)有效果
  3. 遞增NULL值為1
  4. 遞增和遞減在前就先運(yùn)算符后返回,反之就先返回,后運(yùn)算

延伸考點(diǎn): 邏輯運(yùn)算符

  1. 短路作用
  2. || 和 && 與 or和and 的優(yōu)先級(jí)不同
$a=true || $b === 3; //短路作用
$b=false && $a===1;

//比較運(yùn)算符 優(yōu)先級(jí)問(wèn)題
$a = false || true; //返回true
$b = false or true; //返回false

流程控制考點(diǎn)

真題: 請(qǐng)列出三種PHP數(shù)組循環(huán)操作的語(yǔ)法竿滨,并注明各個(gè)循環(huán)的區(qū)別

  1. for
  2. foreach
  3. while,list(),each()組合循環(huán)

for循環(huán)只能遍歷索引數(shù)組,foreach可以遍歷索引和關(guān)聯(lián)數(shù)組.
聯(lián)合使用list(),each()和while循環(huán)同樣可以遍歷索引和關(guān)聯(lián)數(shù)組


while,list(),each()組合不會(huì)reset(),即指針不會(huì)重置
foreach遍歷會(huì)對(duì)數(shù)組進(jìn)行reset()操作

延伸考點(diǎn): PHP分支結(jié)構(gòu)

  1. if ... else if
    • 在elseif語(yǔ)句中只能有一個(gè)表達(dá)式為true,即在elseif語(yǔ)句中只能有一個(gè)語(yǔ)句塊被執(zhí)行,多個(gè)elseif從句是排斥關(guān)系
    • 使用elseif 語(yǔ)句有一個(gè)基本原則,總把優(yōu)先范圍小的條件放在前面處理
  1. switch...case...
    • 和if不同的是,switch后面的控制表達(dá)式的數(shù)據(jù)類型只能是整型,浮點(diǎn)類型或者字符串
    • continue語(yǔ)句作用到switch的作用類似于break跳出switch外的循環(huán),可以使用continue 2
    • switch ... case 會(huì)生成跳轉(zhuǎn)表,直接跳轉(zhuǎn)到對(duì)應(yīng)case
    • 效率: 如果條件比一個(gè)簡(jiǎn)單的比較要復(fù)雜的多或者在一個(gè)很多次的循環(huán)中,那么用switch語(yǔ)句可能快一點(diǎn)

真題: PHP中如何優(yōu)化多個(gè)if...elseif語(yǔ)句的情況?

自定義函數(shù)及內(nèi)部函數(shù)

考點(diǎn):

  1. 變量的作用于和靜態(tài)變量

延伸: 函數(shù)的參數(shù)及參數(shù)的引用傳遞
: 函數(shù)的返回值及引用返回
: 外部文件的導(dǎo)入

變量的作用域

  • 變量的作用域也稱變量的范圍,變量的范圍即它定義的上下文背景(也是它的生效范圍).
  • 大部分的PHP變量只有一個(gè)單獨(dú)的范圍.
  • 這個(gè)單獨(dú)的范圍跨度同樣包含了include和require引入的文件
//寫出如下程序的輸出結(jié)果
$count=5;
function get_count(){
    static $count; //靜態(tài)變量 此時(shí)無(wú)賦值,則為null
    return $count++;    //null++ ==> 1
}

echo $count;    
++$count;

echo get_count();
echo get_count();

考點(diǎn):
變量的作用域和靜態(tài)變量

  • 延伸: 函數(shù)的參數(shù)及參數(shù)的引用傳遞
  • 延伸: 函數(shù)的返回值及引用返回
  • 延伸: 外部文件的導(dǎo)入
  • 延伸: 系統(tǒng)內(nèi)置函數(shù)
$outer='str';
function mgfunc()
{   
    //全局變量引入到函數(shù)體內(nèi)部使用,用關(guān)鍵字global
    global $outer;
    //或者
    $GLOBALS['outer'] //也可以
    echo $outer;
}

靜態(tài)變量

靜態(tài)變量?jī)H在局部函數(shù)中存在,但當(dāng)程序執(zhí)行離開(kāi)此作用域時(shí),其值并不會(huì)消失

static關(guān)鍵字

  1. 僅初始化一次
  2. 初始化時(shí)需要賦值
  3. 每執(zhí)行函數(shù)該值會(huì)保留
  4. static修飾的變量是局部的,僅在函數(shù)內(nèi)部有效
  5. 可以記錄函數(shù)的調(diào)用次數(shù),從而可以在某些條件下終止遞歸
function get_count()
{
    static $count; //只初始化一次
    return $count++;
}

echo get_count(); //null
echo get_count(); //1
echo get_count(); //2

延伸考點(diǎn): 函數(shù)的返回值

  • 值通過(guò)使用可選的返回語(yǔ)句(return)返回可以返回包括數(shù)組和對(duì)象的任意類型
  • 返回語(yǔ)句會(huì)終止函數(shù)執(zhí)行,將控制權(quán)交回函數(shù)調(diào)用處
  • 省略return,返回值為null,不可有多個(gè)返回值

延伸考點(diǎn): 函數(shù)的引用返回

從函數(shù)返回一個(gè)引用,必須在函數(shù)聲明和指派返回值給一個(gè)變量時(shí)都使用引用運(yùn)算符 &

function &myFunc()
{
    static $b=10;
    return $b;
}

$a=myFunc();
$a=&myFunc();
$a=100;
echo myFunc(); //100

延伸考點(diǎn): 外部文件的導(dǎo)入

  • include/require 語(yǔ)句包含并運(yùn)行制定文件
  • 如果給出路徑名按照路徑來(lái)找,否則從include_path中查找
  • 如果include_path中也沒(méi)有,則從調(diào)用腳本文件所在目錄和當(dāng)前工作目錄下尋找
  • 當(dāng)一個(gè)文件被包含時(shí),其中所包含的代碼繼承了include所在行的變量范圍
  • 加載過(guò)程中未找到文件則include結(jié)構(gòu)會(huì)發(fā)出一個(gè)警告;這一點(diǎn)和require不同,后者會(huì)發(fā)出一個(gè)致命錯(cuò)誤

require在出錯(cuò)時(shí)會(huì)產(chǎn)生E_COMPILE_ERROR 級(jí)別錯(cuò)誤.
換句話講將導(dǎo)致腳本終止而include只會(huì)產(chǎn)生警告(E_WARNING),腳本會(huì)繼續(xù)運(yùn)行
require(include)/require_once(include_once)唯一區(qū)別是PHP會(huì)檢查該文件是否已經(jīng)被包含過(guò),如果是則不會(huì)再次包含

延伸考點(diǎn): 系統(tǒng)內(nèi)置函數(shù)

  • 時(shí)間日期函數(shù):

    date(),strtotime(),mktime(),time(),microtime(),date_default_timezone_set()

  • IP處理函數(shù):

    ip2long(),long2ip()

  • 打印處理:

    print(),printf(),print_r(),echo,sprintf(),var_dump(),var_export()

  • 序列化及反序列化函數(shù):

    serialize(),unserialize()

  • 字符串處理函數(shù):

    implode(),explode(),join(),strrev(),trim(),ltrim(),rtrim(),strstr(),number_format()...

  • 數(shù)組處理函數(shù):

    array_keys(),array_values(),array_diff(),array_intersect(),array_merge(),array_shif(),
    array_unshift(),array_pop(),array_push(),sort()...

解題方法:

著重記憶PHP函數(shù)的定義相關(guān)內(nèi)容,理解變量作用域,靜態(tài)變量,函數(shù)的參數(shù)和返回值的相關(guān)內(nèi)容,重點(diǎn)記憶我們總結(jié)的內(nèi)置函數(shù)

//真題
$var1=5;
$var2=10;

function foo(&$my_var)
{
    global $var1;
    $var1 +=2;
    $var2 =4;
    $my_var+=3;
    return $var2;
}

$my_var=5;
echo foo($my_var)."\n";

echo $my_var."\n";
echo $var1;
echo $var2;
$bar='foo';
$my_var=10;
echo $bar($my_var)."\n";
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碱茁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耿焊,更是在濱河造成了極大的恐慌诚镰,老刑警劉巖奕坟,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異清笨,居然都是意外死亡月杉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門抠艾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苛萎,“玉大人,你說(shuō)我怎么就攤上這事检号‰缜福” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵齐苛,是天一觀的道長(zhǎng)翘盖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)凹蜂,這世上最難降的妖魔是什么馍驯? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任阁危,我火速辦了婚禮,結(jié)果婚禮上汰瘫,老公的妹妹穿的比我還像新娘欲芹。我一直安慰自己,他們只是感情好吟吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著颈娜,像睡著了一般剑逃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上官辽,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天蛹磺,我揣著相機(jī)與錄音,去河邊找鬼同仆。 笑死萤捆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俗批。 我是一名探鬼主播俗或,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岁忘!你這毒婦竟也來(lái)了辛慰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤干像,失蹤者是張志新(化名)和其女友劉穎帅腌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體麻汰,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡速客,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了五鲫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溺职。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖位喂,靈堂內(nèi)的尸體忽然破棺而出辅愿,到底是詐尸還是另有隱情,我是刑警寧澤忆某,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布点待,位于F島的核電站,受9級(jí)特大地震影響弃舒,放射性物質(zhì)發(fā)生泄漏癞埠。R本人自食惡果不足惜状原,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苗踪。 院中可真熱鬧颠区,春花似錦、人聲如沸通铲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颅夺。三九已至朋截,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吧黄,已是汗流浹背部服。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拗慨,地道東北人廓八。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赵抢,于是被迫代替她去往敵國(guó)和親剧蹂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一烦却、php可以做什么 php是一種可以在服務(wù)器端運(yùn)行的編程語(yǔ)言国夜,可以運(yùn)行在Web服務(wù)器端。 php是一門后臺(tái)編程語(yǔ)...
    空谷悠閱讀 3,096評(píng)論 4 97
  • 1.認(rèn)識(shí)php php是服務(wù)端嵌入到HTML中的腳本語(yǔ)言短绸。php的功能包括但不限于: 收集表單數(shù)據(jù) 生成動(dòng)態(tài)網(wǎng)頁(yè) ...
    楠哥哥_0b86閱讀 847評(píng)論 3 1
  • php面試題及答案(轉(zhuǎn)載)收藏 基礎(chǔ)題: 1.表單中 get與post提交方法的區(qū)別? 答:get是發(fā)送請(qǐng)求HTT...
    積_漸閱讀 1,639評(píng)論 0 37
  • PHP 學(xué)習(xí)目錄 ├─PHP視頻教程 1 LAMP網(wǎng)站構(gòu)建 │ ├─PHP教程 1.1.1 新版視頻形式介紹│ ...
    曹淵說(shuō)創(chuàng)業(yè)閱讀 16,155評(píng)論 29 417
  • 第一章 基本概念 一车吹、軟件生命周期(SDLC)的六個(gè)階段 (1)問(wèn)題的定義 此階段是軟件開(kāi)發(fā)方與需求方共同討...
    Root_123閱讀 2,798評(píng)論 0 14