php小知識點

2022-05-25 08:36:05 字數 4458 閱讀 6480

php中echo和print都是輸出的作用,但是兩者之間還是有細微的差別。echo輸出後沒有返回值,但print有返回值,當其執行失敗時返回flase。因此可以作為乙個普通函式來使用,例如執行$r = print "hello world"; 變數$r的值將為1。而且**中echo語句的執行效率要略快於print語句。

gettype()、is_array()、is_bool()、is_float()、is_integer()、is_null()、is_numeric()、is_object()、is_resource()、is_scalar() 和 is_string()

gettype() 會根據 引數型別返回下列值 

「boolean」(從 php 4 起) 

「integer」 

「double」(如果是 float 則返回「double」,而不是「float」) 

「string」 

「array」 

「object」 

「resource」(從 php 4 起) 

「null」(從 php 4 起) 

「unknown type」 

這裡需要注意的是 is_numeric()是用來判斷 變數是否是數字或者數字串的 

當is_numeric() 的引數是數字或者數字字串的時候 返回true 否則返 false

1.在錯誤處理方面,使用include語句,如果發生包含錯誤,程式將跳過include語句,雖然會顯示錯誤資訊但是程式還是會繼續執行。但是,requre語句會提示乙個致命錯誤。

2.如果你的web程式使用了mvc這種對檔案包含強依賴的設計方法,請使用require_once。

3.關於包含檔案後作用域問題總結如下:

1).所有在被包含檔案中定義的函式和類在被包含後,在包含檔案裡都具有全域性作用域

2).被包含檔案的變數的作用域,隨著包含位置的變化而變化。比如如果是在函式中包含,被包含檔案的變數是區域性變數

檔案 a.php

1.$name="llj";  

2.class

teacher  

6.}  

7.function

showname()

檔案 index.php

1.function

a()  

6.7.a();//

正常呼叫  

8.9.showname();//

正常呼叫  

10.11.var_dump($name);//

提示$name沒有定義  其$name作用域是a()函式,是區域性的

1) 載入失敗的處理方式不同:

include**`如果引入的檔案不存在`**,試圖繼續往下執行,報乙個warning

(如果你不介意之前的內容是否被包含,之後的內容都要執行,就使用include)

require如果**`引入的檔案不存在`**,報fatal error,不再繼續執行.

(如果之前的內容一定要被包含,才允許繼續執行之後的**,就使用require)

2) 包含檔案不存在或者語法錯誤的時候require是致命的,include不是。

3) include有返回值,而require沒有(可能因為如此require的速度比include快)。

4) 引入時間不同:

require通常使用方法,這個函式通常放在 php 程式的最前面,php 程式在執行前,就會先讀入 require所指定引入的檔案,使它變成 php 程式網頁的一部份。常用的函式,亦可以這個方法將它引入網頁中。

include通常使用方法,這個函式一般是放在流程控制的處理部分中。php 程式網頁在讀到 include的檔案時,才將它讀進來。這種方式,可以把程式執行時的流程簡單化

include/require 與 include_once /require_once的區別

_once 會自動判斷檔案是否已經引入,如果引入,不再重複執行.

即:保證被包含檔案只可能被引入一次.

(如果包含的檔案裡有定義函式,那麼被包含的檔案只能被包含一次,如果多次包含,就會出現函式重定義的錯誤,php是不執行函式重定義的,會出現致命錯誤,之後**不在執行)

有的檔案不允許被包含多次?

可以用_once來控制,但是,如果從檔案的設計上,比較規範,能保證肯定不會出現多次包含的錯誤,

這種情況下 建議用include,

因為include_once要檢測之前有沒有包含,效率沒有include高

關於include和require後面是否加括號的問題

理論上來說:include和require後面加不加括號對執行結果沒有區別,但是加上括號效率較低,所以後面能不加括號就不加括號。

1.作用上

同:包含檔案並執行(使用位置:函式內、函式外、方法內)

異:include_once/require_once是include/require基礎上進一步封裝,增加了乙個「檔案是否已經包含」的判斷

2.效能上

異:由於include_once/require_once是include/require基礎上進一步封裝,所以include_once/require_once比include/require速度慢

3.使用上

異:require包含的檔案存在錯誤或者不存在的話,那麼程式就會中斷執行了,並顯示致命錯誤;

include包含的檔案存在錯誤或者不存在的話,那麼程式不會中端,而是繼續執行,並顯示乙個警告錯誤。

所以一般重要檔案用require(如:類庫),不重要的用include(如:模板)

4.返回值上

同:如果被包含的檔案內用return返回,那麼無論include/require就會有return的值返回;

如果被包含的檔案內沒有使用return返回,那麼無論include/require,成功返回int(1),失敗返回boolean(false)

2.php

<?php

return 'wakaka';

?>

1.php

<?php

$ret = include '2.php';

echo

$ret; //

輸出wakaka

?>

異:如果使用include_once/require_once包含檔案,成功返回boolean(true),失敗返回boolean(false),如果前面已經包含了該檔案,檔案內使用return返回,那麼再使用include_once/require_once包含相同檔案時是返回boolean(true)

在訪問php類中的成員變數或方法時,如果被引用的變數或者方法被宣告成const(常量)或者static(靜態屬性),那麼就必須使用域操作符::,而如果被引用的變數或者方法沒有被宣告成const或者static,那麼就使用指向操作符->。

在foreach迴圈中,如果我們需要更改迭代的元素或是為了提高效率,運用引用是乙個好辦法:

$arr = array(1, 2, 3, 4); 

foreach ($arr

as &$value

) //

now : $arr is array(2, 4, 6, 8)

這裡有個問題很多人會迷糊。迴圈結束後,$value並未銷毀,$value其實是陣列中最後乙個元素的引用,這樣在後續對$value的使用中,如果不知道這一點,會引發一些莫名奇妙的錯誤:)看看下面這段**:

$array = [1, 2, 3];

echo

implode(',', $array), "\n";

foreach ($array

as &$value

) {}

echo

implode(',', $array), "\n";

foreach ($array

as$value

) {}

echo

implode(',', $array), "\n";

執行結果如下:

1,2,3

1,2,3

1,2,2

為什麼是這個結果呢?

我們來分析下。第乙個迴圈過後,$value是陣列中最後乙個元素的引用。第二個迴圈開始:

第一步:複製$arr[0]到$value(注意此時$value是$arr[2]的引用),這時陣列變成[1,2,1]

第二步:複製$arr[1]到$value,這時陣列變成[1,2,2]

第三步:複製$arr[2]到$value,這時陣列變成[1,2,2]

綜上,最終結果就是1,2,2

避免這種錯誤最好的辦法就是在迴圈後立即用unset函式銷毀變數:

$arr = array(1, 2, 3, 4);

foreach ($arr

as &$value

) unset($value);

第三個引數如果為true,會比較型別,效能好,若不寫第三個引數,比如字串數字會先轉成數字,會花費大量時間,效能較低。

php函式和小知識點

語句 分支語句 a 5 if a 5 else if if.else if.else.if if的巢狀 switch a 迴圈語句 for i 0 i 10 i a 10 while a 0 函式四要素 返回型別,函式名 首字母大寫 引數,函式體 函式定義方式 function show 呼叫函式 ...

php的53個小知識點

1 如果能將類的方法定義成static,就盡量定義成static,它的速度會提公升將近4倍。2 row id 的速度是 row id 的7倍。3 echo比print快,並且使用echo的多重引數 譯註 指用逗號而不是句點 代替字串連線,比如echo str1,str2。4 在執行for迴圈之前確定...

Hibernate 小知識點

今天比較忙沒怎麼寫 知識一些曉得知識或是經驗吧!1.lazy延遲載入 也可以說是需要的時候再區載入 場景 乙個類如person和address,person可以通過getaddress 來得到address的set集合.有乙個dao控制類operation.方法public person query...