引言
本文將羅列我在快速閱讀代碼時(shí)所接觸到的模棱兩可的概念及實(shí)操講解。
Q&A
- 1. rand(5, 15)
例如,想要 5 到 15(包括 5 和 15)之間的隨機(jī)數(shù),用rand(5, 15)。
- 2. $strlen=mb_strlen($str,$charset);
function mbsta($str) {
$cut_len=rand(2,5);
$charset='utf-8';
$inter="?";
$strlen=mb_strlen($str,$charset);
$array=array();
while($strlen){
$array[]=mb_substr($str,0,$cut_len,$charset);
$str=mb_substr($str,$cut_len,$strlen-$cut_len,$charset);
$strlen=mb_strlen($str,$charset);
}
implode($inter,$array);
return rand_in_str(implode($inter,$array),urldecode('%F0%9F'.$GLOBALS['emoji'][array_rand($GLOBALS['emoji'],1)]),'utf-8');
}
PHP strlen()和mb_strlen()簡(jiǎn)單解析
strlen():獲取字符串長(zhǎng)度
說明:
int strlen ( string $string )
返回給定的字符串 string 的長(zhǎng)度。
參數(shù)
string 需要計(jì)算長(zhǎng)度的字符串。
返回值
成功則返回字符串 string 的長(zhǎng)度;如果 string 為空,則返回 0。
mb_strlen:獲取字符串的長(zhǎng)度
說明
mixed mb_strlen ( string $str[, string $encoding = mb_internal_encoding() ] )
獲取一個(gè) string 的長(zhǎng)度。
參數(shù)
str 要檢查長(zhǎng)度的字符串。
encoding encoding參數(shù)為字符編碼。如果省略,則使用內(nèi)部字符編碼。
返回值
返回具有 encoding 編碼的字符串 str 包含的字符數(shù)。 多字節(jié)的字符被計(jì)為 1。
如果給定的 encoding 無效則返回 FALSE。
上面是手冊(cè)中關(guān)于兩個(gè)函數(shù)的解釋,乍一看,好像都差不多。
下面通過實(shí)例,來講解兩者之間的區(qū)別。
//文件的編碼方式為UTF8
$str='字a符1串b長(zhǎng)2度';
echo strlen($str).'<br>';//19
echo mb_strlen($str,'utf-8').'<br>';//9
再看下一個(gè)例子
<?php
//文件的編碼方式為gb2312
$str='字a符1串b長(zhǎng)2度';
echo strlen($str).'<br>';//14
echo mb_strlen($str,'utf-8').'<br>';//9
?>
結(jié)果分析:在strlen字符長(zhǎng)度時(shí),一個(gè)UTF8的中文字符算3個(gè)長(zhǎng)度,
所以“字a符1串b長(zhǎng)2度”長(zhǎng)度是3+1+3+1+3+1+3+1+3=19,
在mb_strlen計(jì)算時(shí),選定內(nèi)碼為UTF8,則會(huì)將一個(gè)中文字符當(dāng)作長(zhǎng)度1來計(jì)算,所以“字a符1串b長(zhǎng)2度”長(zhǎng)度是9 .
在gb2312中,strlen計(jì)算字符長(zhǎng)度時(shí),一個(gè)中文字符算2個(gè)長(zhǎng)度。
另外,需要注意的是,mb_strlen并不是PHP核心函數(shù),使用前需要確保在php.ini中加載php_mbstring.dll,否則會(huì)出現(xiàn)未定義函 數(shù)的問題。
-
3. mb_substr
mb_substr — 獲取部分字符串
說明
string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
根據(jù)字符數(shù)執(zhí)行一個(gè)多字節(jié)安全的 substr() 操作。 位置是從 str 的開始位置進(jìn)行計(jì)數(shù)。 第一個(gè)字符的位置是 0。第二個(gè)字符的位置是 1,以此類推。
參數(shù)
str
從該 string 中提取子字符串。
start
如果 start 不是負(fù)數(shù),返回的字符串會(huì)從 str 第 start 的位置開始,從 0 開始計(jì)數(shù)。舉個(gè)例子,字符串 'abcdef',位置 0 的字符是 'a',位置 2 的字符是 'c',以此類推。
如果 start 是負(fù)數(shù),返回的字符串是從 str 末尾處第 start 個(gè)字符開始的。
length
str 中要使用的最大字符數(shù)。如果省略了此參數(shù)或者傳入了 NULL,則會(huì)提取到字符串的尾部。
encoding
encoding 參數(shù)為字符編碼。如果省略,則使用內(nèi)部字符編碼。
返回值
mb_substr() 函數(shù)根據(jù) start 和 length 參數(shù)返回 str 中指定的部分。
- 4. php array_push 與 $arr[]=$value 性能比較
array_push方法
array_push 方法,將一個(gè)或多個(gè)元素壓入數(shù)組的末尾。
int array_push ( array &$array , mixed $var [, mixed $... ] )
array_push() 將array當(dāng)成一個(gè)棧,并將傳入的變量壓入array的末尾。array的長(zhǎng)度將根據(jù)入棧變量的數(shù)目增加。
與下效果相同:
<?php
$arr[] = $value;
?>
比較array_push與 $arr[]=$value性能
使用array_push壓入1000000個(gè)元素
<?php
$starttime = get_microtime();
$arr = array();
for($i=0; $i<1000000; $i++){
array_push($arr, $i);
}
$endtime = get_microtime();
printf("run time %f ms\r\n", ($endtime-$starttime)*1000);
function get_microtime(){
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
?>
執(zhí)行時(shí)間:2735.545158 ms
使用$arr[] = $value壓入100000個(gè)元素
<?php
$starttime = get_microtime();
$arr = array();
for($i=0; $i<1000000; $i++){
$arr[] = $i;
}
$endtime = get_microtime();
printf("run time %f ms\r\n", ($endtime-$starttime)*1000);
function get_microtime(){
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
?>
執(zhí)行時(shí)間:417.458057 ms
結(jié)果:每次壓入一個(gè)元素,使用$arr[]=$value比使用array_push方法快7倍。
同時(shí)壓入多個(gè)元素比較
使用array_push方法,壓入100000個(gè)元素,每次壓入50個(gè)元素
<?php
$starttime = get_microtime();
$arr = array();
for($i=0; $i<1000000; $i=$i+50){
array_push($arr, $i,$i+1,$i+2,$i+3,$i+4,$i+5,$i+6,$i+7,$i+8,$i+9,$i+10,
$i+11,$i+12,$i+13,$i+14,$i+15,$i+16,$i+17,$i+18,$i+19,
$i+21,$i+22,$i+23,$i+24,$i+25,$i+26,$i+27,$i+28,$i+29,
$i+31,$i+32,$i+33,$i+34,$i+35,$i+36,$i+37,$i+38,$i+39,
$i+41,$i+42,$i+43,$i+44,$i+45,$i+46,$i+47,$i+48,$i+49);
}
$endtime = get_microtime();
printf("run time %f ms\r\n", ($endtime-$starttime)*1000);
function get_microtime(){
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
?>
執(zhí)行時(shí)間:250.149012 ms
結(jié)果:使用array_push一次壓入多個(gè)元素,比多次使用$arr[]=$value壓入快。array_push一次壓入的元素越多,則效率越高。
總結(jié):
如果是壓入一個(gè)元素,使用$arr[]=$value效率高,因?yàn)榭梢怨?jié)省調(diào)用函數(shù)的額外負(fù)擔(dān)。
如果同時(shí)壓入多個(gè)元素,使用array_push效率高,因?yàn)椴挥弥貜?fù)獲取文件尾的指針。
- 5. implode()
把數(shù)組元素組合為字符串:
<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr);
?>
implode() 函數(shù)返回由數(shù)組元素組合成的字符串。
注釋:implode() 函數(shù)接受兩種參數(shù)順序。但是由于歷史原因,explode() 是不行的,您必須保證 separator 參數(shù)在 string 參數(shù)之前才行。
注釋:implode() 函數(shù)的 separator 參數(shù)是可選的。但是為了向后兼容,推薦您使用使用兩個(gè)參數(shù)。
注釋:該函數(shù)是二進(jìn)制安全的。
implode(separator,array)
| 參數(shù) | 描述 |
|---|---|
| separator | 可選。規(guī)定數(shù)組元素之間放置的內(nèi)容。默認(rèn)是 ""(空字符串)。 |
| array | 必需。要組合為字符串的數(shù)組。 |
用不同的字符分隔數(shù)組元素:
<!DOCTYPE html>
<html>
<body>
<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr)."<br>";
echo implode("+",$arr)."<br>";
echo implode("-",$arr)."<br>";
echo implode("X",$arr);
?>
</body>
</html>
結(jié)果為:
Hello World! I love Shanghai!
Hello+World!+I+love+Shanghai!
Hello-World!-I-love-Shanghai!
HelloXWorld!XIXloveXShanghai!
- 6. array_rand()
返回包含隨機(jī)鍵名的數(shù)組:
<?php
$a=array("red","green","blue","yellow","brown");
$random_keys=array_rand($a,3);
echo $a[$random_keys[0]]."<br>";
echo $a[$random_keys[1]]."<br>";
echo $a[$random_keys[2]];
?>
說明
array_rand() 函數(shù)從數(shù)組中隨機(jī)選出一個(gè)或多個(gè)元素,并返回。
第二個(gè)參數(shù)用來確定要選出幾個(gè)元素。如果選出的元素不止一個(gè),則返回包含隨機(jī)鍵名的數(shù)組,否則返回該元素的鍵名。
- 7. PHP urldecode()與urlencode()函數(shù)
urlencode()函數(shù)原理就是首先把中文字符轉(zhuǎn)換為十六進(jìn)制,然后在每個(gè)字符前面加一個(gè)標(biāo)識(shí)符%,對(duì)字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(hào)(+)。
urldecode()函數(shù)與urlencode()函數(shù)原理相反,用于解碼已編碼的 URL 字符串,其原理就是把十六進(jìn)制字符串轉(zhuǎn)換為中文字符。
For example:
index.html
<?php
header("Content-Type:text/html;charset=utf-8");
$parm=urlencode("演示PHP-MYSQL");
$url="index.php?par=".$parm;
?>
<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Strict//EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>insert into title</title>
</head>
<body>
<a href="<?php echo $url;?>">urlencode演示</a>
</body>
</html>
url輸出結(jié)果:http://localhost/namespace2/space2/index3.php?par=%E6%BC%94%E7%A4%BAPHP-MYSQL
index.php
$parValue=$_GET['par'];
echo urldecode($parValue);
OutPut: 演示PHP-MYSQL
- 8. base64_encode
base64_encode算法原理
Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。它通常用作存儲(chǔ)、傳輸一些二進(jìn)制數(shù)據(jù)編碼方法!也是MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展,主要用作電子郵件標(biāo)準(zhǔn))中一種可打印字符表示二進(jìn)制數(shù)據(jù)的常見編碼方法!它其實(shí)只是定義用可打印字符傳輸內(nèi)容一種方法,并不會(huì)產(chǎn)生新的字符集!
可逆轉(zhuǎn)的加密為:base64_encode()、urlencode()
相對(duì)應(yīng)的解密函數(shù):base64_decode() 、urldecode()
不可逆的加密函數(shù)為:md5()、crypt()
- 9. cache::
PHP中::是個(gè)什么意思?
類中 靜態(tài)方法和靜態(tài)屬性的引用方法
例如:
class Test{
public static $test = 1;
public static function test(){
}
}
可以不用實(shí)例化對(duì)象直接使用 Test::$test 來取得$test屬性的值
靜態(tài)方法調(diào)用也同理Test::test(); 直接調(diào)用靜態(tài)方法test
- 10. php 中self,this的區(qū)別和實(shí)際操作
先初步解釋一下,this是指向當(dāng)前對(duì)象的指針(可以看成C里面的指針),self是指向當(dāng)前類的指針。
self可以訪問本類中的靜態(tài)屬性和靜態(tài)方法,可以訪問父類中的靜態(tài)屬性和靜態(tài)方法。用self時(shí),可以不用實(shí)例化的
class self_test {
static $instance;
public function __construct(){
self::$instance = 'instance';//靜態(tài)屬性只能通過self來訪問
}
public function tank(){
return self::$instance;//訪問靜態(tài)屬性
}
}
$str = new self_test();
echo $str->tank();
頁面輸出:instance
class self_test {
static $instance;
public function __construct(){
self::$instance = 'dell';
}
static public function pentium(){
return self::$instance;//靜態(tài)方法也可以繼續(xù)訪問靜態(tài)變量,訪問時(shí)需要加$
}
public function tank(){
return self::pentium();//訪問靜態(tài)方法pentium()
}
}
$str = new self_test();
echo $str->tank();
頁面輸出:dell
self可以訪問const定義的常量
class self_test {
const NAME = 'tancy';
public function tank(){
return self::NAME;
}
}
$str = new self_test();
echo $str->tank();
this可以調(diào)用本類中的方法和屬性,也可以調(diào)用父類中的可以調(diào)的方法和屬性,可以說除了靜態(tài)和const常量,基本上其他都可以使用this訪問到
class self_test {
public $public;
private $private;
protected $protected;
public function __construct(){
$this->public = 'public';
$this->private = 'private';
$this->protected = 'protected';
}
public function tank(){
return $this->public;
}
public function dell(){
return $this->private;
}
public function datesrt(){
return $this->protected;
}
}
$str = new self_test();
echo $str->tank();
echo "</br>";
echo $str->dell();
echo "</br>";
echo $str->datesrt();
一句話,self是引用靜態(tài)類的類名,而$this是引用非靜態(tài)類的實(shí)例名。
- 11. PHP引用(&)使用詳解
php的引用(就是在變量或者函數(shù)、對(duì)象等前面加上&符號(hào))
在PHP 中引用的意思是:不同的名字訪問同一個(gè)變量?jī)?nèi)容。
與C語言中的指針是有差別的.C語言中的指針里面存儲(chǔ)的是變量的內(nèi)容,在內(nèi)存中存放的地址。
1.變量的引用
PHP 的引用允許你用兩個(gè)變量來指向同一個(gè)內(nèi)容
<?php
$a="ABC";
$b =&$a;
echo $a;//這里輸出:ABC
echo $b;//這里輸出:ABC
$b="EFG";
echo $a;//這里$a的值變?yōu)镋FG 所以輸出EFG
echo $b;//這里輸出EFG
?>
2.函數(shù)的引用傳遞(傳址調(diào)用)
傳址調(diào)用我就不多說了 下面直接給出代碼
<?php
function test(&$a){
$a=$a+100;
}
$b=1;
echo $b;//輸出1
test($b); //這里$b傳遞給函數(shù)的其實(shí)是$b的變量?jī)?nèi)容所處的內(nèi)存地址,通過在函數(shù)里改變$a的值 就可以改變$b的值了
echo "<br>";
echo $b;//輸出101
?>
要注意的是,在這里test(1);的話就會(huì)出錯(cuò),原因自己去想。
注意:
上面的“ test($b); ” 中的$b前面不要加 & 符號(hào),但是在函數(shù)“call_user_func_array”中,若要引用傳參,就得需要 & 符號(hào),如下代碼所示:
<?php
function a(&$b){
$b++;
}
$c=0;
call_user_func_array('a',array(&$c));
echo $c;
//輸出 1
?>
3.函數(shù)的引用返回
<?php
function &test(){
static $b=0;//申明一個(gè)靜態(tài)變量
$b=$b+1;
echo $b;
return $b;
}
$a=test();//這條語句會(huì)輸出 $b的值 為1
$a=5;
$a=test();//這條語句會(huì)輸出 $b的值 為2
$a=&test();//這條語句會(huì)輸出 $b的值 為3
$a=5;
$a=test();//這條語句會(huì)輸出 $b的值 為6
?>
下面解釋下:
通過這種方式$a=test();得到的其實(shí)不是函數(shù)的引用返回,這跟普通的函數(shù)調(diào)用沒有區(qū)別
至于原因: 這是PHP的規(guī)定
PHP規(guī)定通過$a=&test(); 方式得到的才是函數(shù)的引用返回
至于什么是引用返回呢(PHP手冊(cè)上說:引用返回用在當(dāng)想用函數(shù)找到引用應(yīng)該被綁定在哪一個(gè)變量上面時(shí)。) 這句狗屁話 害我半天沒看懂
用上面的例子來解釋就是
$a=test()方式調(diào)用函數(shù),只是將函數(shù)的值賦給$a而已, 而$a做任何改變 都不會(huì)影響到函數(shù)中的$b
而通過$a=&test()方式調(diào)用函數(shù)呢, 他的作用是 將return $b中的 $b變量的內(nèi)存地址與$a變量的內(nèi)存地址 指向了同一個(gè)地方
即產(chǎn)生了相當(dāng)于這樣的效果($a=&$b;) 所以改變$a的值 也同時(shí)改變了$b的值 所以在執(zhí)行了
$a=&test();
$a=5;
以后,$b的值變?yōu)榱?
這里是為了讓大家理解函數(shù)的引用返回才使用靜態(tài)變量的,其實(shí)函數(shù)的引用返回多用在對(duì)象中
另附一個(gè)php官方例子:
This is the way how we use pointer to access variable inside the class.
<?php
class talker{
private $data = 'Hi';
public function & get(){
return $this->data;
}
public function out(){
echo $this->data;
}
}
$aa = new talker();
$d = &$aa->get();
$aa->out();
$d = 'How';
$aa->out();
$d = 'Are';
$aa->out();
$d = 'You';
$aa->out();
?>
the output is "HiHowAreYou"
4.對(duì)象的引用
<?php
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//這里輸出ABC
echo $c->abc;//這里輸出ABC
$b->abc="DEF";
echo $c->abc;//這里輸出DEF
?>
在PHP5中 對(duì)象的賦值是個(gè)引用的過程。上列中$b=new a; $c=$b; 其實(shí)等效于$b=new a; $c=&$b;
5.引用的作用
如果程序比較大,引用同一個(gè)對(duì)象的變量比較多,并且希望用完該對(duì)象后手工清除它,個(gè)人建議用 "&" 方式,然后用$var=null的方式清除. 其它時(shí)候還是用php5的默認(rèn)方式吧. 另外, php5中對(duì)于大數(shù)組的傳遞,建議用 "&" 方式, 畢竟節(jié)省內(nèi)存空間使用。
6.取消引用
當(dāng)你 unset 一個(gè)引用,只是斷開了變量名和變量?jī)?nèi)容之間的綁定。這并不意味著變量?jī)?nèi)容被銷毀了。例如:
<?php
$a = 1;
$b =& $a;
unset ($a);
?>
不會(huì) unset $b,只是 $a。
- 12. PHP rtrim() 函數(shù)
從字符串右側(cè)移除字符:
<?php
$str = "Hello World!";
echo $str . "<br>";
echo rtrim($str,"World!");
?>
運(yùn)行結(jié)果:
Hello World!
Hello
rtrim() 函數(shù)移除字符串右側(cè)的空白字符或其他預(yù)定義字符。
rtrim(string,charlist)
charlist:可選。規(guī)定從字符串中刪除哪些字符。如果省略,則移除下列所有字符:
"\0" - NULL
"\t" - 制表符
"\n" - 換行
"\x0B" - 垂直制表符
"\r" - 回車
" " - 空格
- 13. php中var_export的使用
1.var_export用于將數(shù)組轉(zhuǎn)換成字符串
<?php
$arr = [
'key1'=>'val1',
'key2'=>'val2',
'key3'=>'val3',
'key4'=>'val4',
'key5'=>'val5'
];
$str = var_export($arr,true);
echo $str;//結(jié)果 array ( 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3', 'key4' => 'val4', 'key5' => 'val5', )
?>
2.什么地方會(huì)用到該方法?
(1)通常,在數(shù)據(jù)庫里面會(huì)創(chuàng)建一張表,用于存放所有配置項(xiàng)的信息(該表往往只有兩個(gè)字段:name和value)
(2)我們?cè)诤笈_(tái)修改配置項(xiàng)的值以后,除了保存到數(shù)據(jù)表以外,還要保存到文件中,以方便讀取,這里就要用到該方法了
(3)將修改后的配置表所有數(shù)據(jù)取出,存放到數(shù)組$data中
$path = 'web.php';
$str = '<?php return ';
$str .=
var_export($data,true);//數(shù)組轉(zhuǎn)字符串
$str .= ';';
file_put_contents($path,$str);=
這樣就將數(shù)組保存成字符串了
- 14. $f = @fopen($file, 'ab+');
定義和用法
fopen() 函數(shù)打開文件或者 URL。
如果打開失敗,本函數(shù)返回 FALSE。
fopen(filename,mode,include_path,context)
$f = @fopen($file, 'ab+');
@在PHP中叫錯(cuò)誤抑制符,也就是用來屏蔽錯(cuò)誤的。
@之后的表達(dá)式如果出錯(cuò)誤,是不提示錯(cuò)誤信息的,如果不加@出錯(cuò)之后一般是會(huì)在瀏覽器中顯示錯(cuò)誤信息,加上之后瀏覽器中就不顯示錯(cuò)誤信息了。
你可以嘗試下,看看加與不加的區(qū)別。
b指的是換行
"a+" 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
說明
fopen() 將 filename 指定的名字資源綁定到一個(gè)流上。如果 filename 是 "scheme://..." 的格式,則被當(dāng)成一個(gè) URL,PHP 將搜索協(xié)議處理器(也被稱為封裝協(xié)議)來處理此模式。如果該協(xié)議尚未注冊(cè)封裝協(xié)議,PHP 將發(fā)出一條消息來幫助檢查腳本中潛在的問題并將 filename 當(dāng)成一個(gè)普通的文件名繼續(xù)執(zhí)行下去。
如果 PHP 認(rèn)為 filename 指定的是一個(gè)本地文件,將嘗試在該文件上打開一個(gè)流。該文件必須是 PHP 可以訪問的,因此需要確認(rèn)文件訪問權(quán)限允許該訪問。如果激活了安全模式或者 open_basedir 則會(huì)應(yīng)用進(jìn)一步的限制。
提示和注釋
注釋:不同的操作系統(tǒng)家族具有不同的行結(jié)束習(xí)慣。當(dāng)寫入一個(gè)文本文件并想插入一個(gè)新行時(shí),需要使用符合操作系統(tǒng)的行結(jié)束符號(hào)?;?Unix 的系統(tǒng)使用 \n 作為行結(jié)束字符,基于 Windows 的系統(tǒng)使用 \r\n 作為行結(jié)束字符,基于 Macintosh 的系統(tǒng)使用 \r 作為行結(jié)束字符。 如果寫入文件時(shí)使用了錯(cuò)誤的行結(jié)束符號(hào),則其它應(yīng)用程序打開這些文件時(shí)可能會(huì)表現(xiàn)得很怪異。
Windows 下提供了一個(gè)文本轉(zhuǎn)換標(biāo)記("t")可以透明地將 \n 轉(zhuǎn)換為 \r\n。與此對(duì)應(yīng)還可以使用 "b" 來強(qiáng)制使用二進(jìn)制模式,這樣就不會(huì)轉(zhuǎn)換數(shù)據(jù)。要使用這些標(biāo)記,要么用 "b" 或者用 "t" 作為 mode 參數(shù)的最后一個(gè)字符。
默認(rèn)的轉(zhuǎn)換模式依賴于 SAPI 和所使用的 PHP 版本,因此為了便于移植鼓勵(lì)總是指定恰當(dāng)?shù)臉?biāo)記。如果是操作純文本文件并在腳本中使用了 \n 作為行結(jié)束符,但還要期望這些文件可以被其它應(yīng)用程序例如 Notepad 讀取,則在 mode 中使用 "t"。在所有其它情況下使用 "b"。
在操作二進(jìn)制文件時(shí)如果沒有指定 "b" 標(biāo)記,可能會(huì)碰到一些奇怪的問題,包括壞掉的圖片文件以及關(guān)于 \r\n 字符的奇怪問題。
注釋:為移植性考慮,強(qiáng)烈建議在用 fopen() 打開文件時(shí)總是使用 "b" 標(biāo)記。
注釋:再一次,為移植性考慮,強(qiáng)烈建議你重寫那些依賴于 "t" 模式的代碼使其使用正確的行結(jié)束符并改成 "b" 模式。
例子
<?php
$file = fopen("test.txt","r");
$file = fopen("/home/test/test.txt","r");
$file = fopen("/home/test/test.gif","wb");
$file = fopen("http://www.example.com/","r");
$file = fopen("ftp://user:password@example.com/test.txt","w");
?>
- 15. @flock($f, LOCK_EX)
定義和用法
flock() 函數(shù)鎖定或釋放文件。
若成功,則返回 true。若失敗,則返回 false。
語法
flock(file,lock,block)
| 參數(shù) | 描述 |
|---|---|
| file | 必需。規(guī)定要鎖定或釋放的已打開的文件。 |
| lock | 必需。規(guī)定要使用哪種鎖定類型。 |
| block | 可選。若設(shè)置為 1 或 true,則當(dāng)進(jìn)行鎖定時(shí)阻擋其他進(jìn)程。 |
說明
flock() 操作的 file 必須是一個(gè)已經(jīng)打開的文件指針。
lock 參數(shù)可以是以下值之一:
要取得共享鎖定(讀取的程序),將 lock 設(shè)為 LOCK_SH(PHP 4.0.1 以前的版本設(shè)置為 1)。
要取得獨(dú)占鎖定(寫入的程序),將 lock 設(shè)為 LOCK_EX(PHP 4.0.1 以前的版本中設(shè)置為 2)。
要釋放鎖定(無論共享或獨(dú)占),將 lock 設(shè)為 LOCK_UN(PHP 4.0.1 以前的版本中設(shè)置為 3)。
如果不希望 flock() 在鎖定時(shí)堵塞,則給 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中設(shè)置為 4)。
提示和注釋
提示:可以通過 fclose() 來釋放鎖定操作,代碼執(zhí)行完畢時(shí)也會(huì)自動(dòng)調(diào)用。
注釋:由于 flock() 需要一個(gè)文件指針, 因此可能不得不用一個(gè)特殊的鎖定文件來保護(hù)打算通過寫模式打開的文件的訪問(在 fopen() 函數(shù)中加入 "w" 或 "w+")。
例子:
<?php
$file = fopen("test.txt","w+");
// 排它性的鎖定
if (flock($file,LOCK_EX))
{
fwrite($file,"Write something");
// release lock
flock($file,LOCK_UN);
}
else
{
echo "Error locking file!";
}
fclose($file);
?>
- 16. fseek($f, 0);
定義和用法
fseek() 函數(shù)在打開的文件中定位。
該函數(shù)把文件指針從當(dāng)前位置向前或向后移動(dòng)到新的位置,新位置從文件頭開始以字節(jié)數(shù)度量。
成功則返回 0;否則返回 -1。注意,移動(dòng)到 EOF 之后的位置不會(huì)產(chǎn)生錯(cuò)誤。
語法:
fseek(file,offset,whence)
offset 必需。規(guī)定新的位置(從文件頭開始以字節(jié)數(shù)度量)。
例子
<?php
$file = fopen("test.txt","r");
// 讀取第一行
fgets($file);
// 倒回文件的開頭
fseek($file,0);
?>
- 17. ftruncate($f, 0);
ftruncate() 函數(shù)把文件截?cái)嗟街付ǖ拈L(zhǎng)度。
ftruncate(file,size)
| 參數(shù) | 描述 |
|---|---|
| file | 必需。規(guī)定要截?cái)嗟拇蜷_文件。 |
| size | 必需。規(guī)定新的文件大小。 |
接受文件指針 file 作為參數(shù),并將文件大小截取為 size。如果成功則返回 TRUE,否則返回 FALSE。
- 18.@fwrite($f, $string);
fwrite() 函數(shù)寫入文件(可安全用于二進(jìn)制文件)。
fwrite(file,string,length)
| 參數(shù) | 描述 |
|---|---|
| file | 必需。規(guī)定要寫入的打開文件。 |
| string | 必需。規(guī)定要寫入文件的字符串。 |
| length | 可選。規(guī)定要寫入的最大字節(jié)數(shù)。 |
fwrite() 把 string 的內(nèi)容寫入文件指針 file 處。 如果指定了 length,當(dāng)寫入了 length 個(gè)字節(jié)或者寫完了 string 以后,寫入就會(huì)停止,視乎先碰到哪種情況。
fwrite() 返回寫入的字符數(shù),出現(xiàn)錯(cuò)誤時(shí)則返回 false。
- 19.chmod
定義和用法
chmod() 函數(shù)改變文件模式。
如果成功則返回 TRUE,否則返回 FALSE。
chmod(file,mode)
mode
可選。規(guī)定新的權(quán)限。
mode 參數(shù)由 4 個(gè)數(shù)字組成:
第一個(gè)數(shù)字永遠(yuǎn)是 0
第二個(gè)數(shù)字規(guī)定所有者的權(quán)限
第二個(gè)數(shù)字規(guī)定所有者所屬的用戶組的權(quán)限
第四個(gè)數(shù)字規(guī)定其他所有人的權(quán)限
可能的值(如需設(shè)置多個(gè)權(quán)限,請(qǐng)對(duì)下面的數(shù)字進(jìn)行總計(jì)):
1 - 執(zhí)行權(quán)限
2 - 寫權(quán)限
4 - 讀權(quán)限
例子
<?php
// 所有者可讀寫,其他人沒有任何權(quán)限
chmod("test.txt",0600);
// 所有者可讀寫,其他人可讀
chmod("test.txt",0644);
// 所有者有所有權(quán)限,其他所有人可讀和執(zhí)行
chmod("test.txt",0755);
// 所有者有所有權(quán)限,所有者所在的組可讀
chmod("test.txt",0740);
?>
- 20. return include $file;
php有一個(gè)include,顧名思義,就是用來包含文件的。相應(yīng)的還有require,以及兩個(gè)帶once的。不知道大家有沒有注意過include的 返回值。通常情況下,包含成功返回1,包含失敗返回false。但是,如果被包含文件中用return返回,那么這個(gè)值就是return的值。比如:
1.php
<?php
$ret = include '2.php';
echo $ret; //輸出wakaka
?>
2.php
<?php
return 'wakaka';
?>
從1.php的輸出就可以看到,這里include的返回值就是2.php中return的那個(gè)'wakaka'。
這個(gè)特性有什么用呢? 我是利用它來方便地使用php文件來做配置。比如,一個(gè)配置文件可以這么寫:
config.php
<?php
return array(
'db'=>array(
'host' => 'localhost',
'user' => 'root',
'password' => 'wakaka',
'name' => 'test',
'encoding' => 'utf8'
)
);
?>
載入的時(shí)候,只需要$conf = include 'config.php';就可以了。 Thinkphp 的配置文件就是這樣返回的。
- 21. 如何在html文件中嵌入php代碼
在html文件中嵌入php代碼時(shí)會(huì)發(fā)現(xiàn)頁面顯示并沒有達(dá)到預(yù)期效果,原因是服務(wù)器在解析html文件時(shí)沒有解析php代碼部分,除了修改后綴名為php之外還可以修改httpd.conf文件,具體修改如下:
將
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .pps
修改為
AddType application/x-httpd-php .html .htm .php .phtml
AddType application/x-httpd-php-source .html .htm .phps
原先httpd.conf中只有AddType application/x-httpd-php .php
需要加入
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html兩行,
你也可以加入更多,實(shí)質(zhì)就是添加可以執(zhí)行php的文件類型,比如你再加上一行
AddType application/x-httpd-php .htm,則.htm文件也可以執(zhí)行php程序了,你甚至還可以添加上一行
AddType application/x-httpd-php .txt,讓普通的文本文件格式也能運(yùn)行php程序。
實(shí)操下來,發(fā)現(xiàn)httpd.conf中沒有AddType application/x-httpd-php .php
這是怎么回事呢?
讓apache支持php文件的解釋,有2種方法配置,RPM裝的默認(rèn)配置是:
AddHandler php5-script .php
AddType text/html .php
網(wǎng)上很多人的配置方法是:
AddType application/x-httpd-php .php
AddHandler 指令的作用是: 在文件擴(kuò)展名與特定的處理器之間建立映射
比如: AddHandler php5-script .php 指定擴(kuò)展名為 .php 的文件應(yīng)被 php5-srcipt 處理器來處理。AddType 指令 作用:在給定的文件擴(kuò)展名與特定的內(nèi)容類型之間建立映射 語法:AddType MIME-type extension [extension] ...
AddType指令在給定的文件擴(kuò)展名與特定的內(nèi)容類型之間建立映射關(guān)系。
MIME-type指明了包含extension擴(kuò)展名的文件的媒體類型。
AddType 是與類型表相關(guān)的,描述的是擴(kuò)展名與文件類型之間的關(guān)系。
AddHandler 說明什么樣的擴(kuò)展名使用什么樣的程序來處理,描述的是擴(kuò)展名與處理程序之間的關(guān)系。
因此,html內(nèi)嵌php代碼無法解析出現(xiàn)了另外一種解法:
現(xiàn)象:
php, apache都安裝完成,但是這樣的代碼,瀏覽器無法解析其的php代碼.
<html><body><h1>d</h1>
<?php
echo "test";
?>
</body></html>
問題解決:
在httpd.conf中加入以下二條, 重啟.OK!
AddHandler php5-script .php .html
AddType text/html .php .html