文/michaelgbw
php的開發(fā)者在程序開發(fā)界一直占有著一席之地,我也是這樣的一個phper,我們今天并不是要說php是什么,我想這大家baidu,google一下,比我講的清楚,這是肯定的。
在面試中,php的語法因?yàn)楹唵我锥?,所以有時(shí)并不做為考察點(diǎn)出現(xiàn),還有,目前就中國整個的php開發(fā)環(huán)境來說,thinkphp,yii,lavarel等框架已經(jīng)是標(biāo)配。我沒事就會問自己,離開框架我們還會開發(fā)嗎,或者說還能正確的開發(fā)嗎,有時(shí)我們也會用php在cli的模式下運(yùn)行,run個什么crontab什么的,這個可是沒有框架給我們用呀。
所以 我們今天不說框架,不說原理(能力也有限),我們來說說原生的技巧。以下內(nèi)容大多數(shù)都是我在學(xué)習(xí),工作中遇到的。我們一起來看~
預(yù)定義常量
PATH_SEPARATOR //路徑分隔符(Windows為分號,類Unix為冒號)
DIRECTORY_SEPARATOR //目錄分隔符
PHP_EOL //當(dāng)前系統(tǒng)的換行符
PHP_VERSION //PHP版本號
PHP_OS //PHP服務(wù)操作系統(tǒng)
PHP_SAPI //用來判斷是使用命令行還是瀏覽器執(zhí)行的,如果 PHP_SAPI=='cli' 表示是在命令行下執(zhí)行
PHP_INT_MAX INT最大值,32位平臺時(shí)值為2147483647
PHP_INT_SIZE INT字長,32位平臺時(shí)值為4(4字節(jié))
M_PI //圓周率值
M_E //自然數(shù)
FILE 所在文件的絕對路徑
LINE 文件中的當(dāng)前行號
DIR 文件所在目錄
FUNCTION 函數(shù)名稱
CLASS 類的名稱
METHOD 類的方法名
NAMESPACE 當(dāng)前命名空間的名稱
可變標(biāo)識符
//可變變量
$i = 3;
$k = 'i';
echo $$k; //輸出3
//可變函數(shù)
function func(){
echo 'hello!';
}
$i = 'func';
$i(); //輸出hello
//可變類名
class CLS{
public $k = 'hello';
}
$i = 'CLS';
$j = new $i;
echo $j->k;
//可變屬性
class CLS{
public $k = 'hello';
}
$i = 'k';
$j = new CLS;
echo $j->$i;
.//可變方法
class CLS{
public function k(){
echo 'hello';
}
}
$i='k';
$j=new CLS;
$j->$i();
雙引號,單引號
php中,單引號和雙音號都可以定義一段字符串,但區(qū)別是雙引號會默認(rèn)在解析中進(jìn)行處理。而單引號不會。
$user='gbw';
$sql="select * from user as u where u.name='$user'";
這個語句是正確解析出$user的。但單引號就不行了。但單引號直接display到view中去會更好,因?yàn)樯倭藢咏馕?,更快?br> 還有php的特定寫法
$str = <<<EOT
字符串內(nèi)容
EOT;
就是三個<和一個名字將一大段字符包裹起來,這個方法是不需要“”的,一般用在中間大量引用html時(shí)。
empty(),isset(),==null,==0問題
為什么我會拋出這個問題呢,因?yàn)槲以?jīng)被他坑過,嗚嗚嗚~
$string="php vs java,but we do not care result about this";
$str="php";
if(strpos($string,$str)){
echo 'find';
}
else{
echo 'no';
}
//no
這個例子大家在php開發(fā)中會不會遇到呢,strpos()返回字符串中特定字符的位置,明顯是0,好,php是弱類型語言,0和null一樣,自然是no,對于這個問題,建議用strstr判斷。
這只是個引子,
$str=0;
if(!isset($str)){
echo 'empty';
}
else{
echo 'no';
}//no
if(empty($str)){
echo 'empty';
}
else{
echo 'no';
}//empty
if($str===null){
echo 'empty';
}
else{
echo 'no';
}//no
if($str==null){
echo 'empty';
}
else{
echo 'no';
}//empty
這里大家應(yīng)該都明白了的吧,null 即是empty(),0即是null,但0并不是===null,即0還是int,null是空.
閉包
function closureCreater() {
$x = 1;
return function($fun = null) use(&$x) {//按引用傳值
echo "<br />" . $x++;
$fun and $fun();
};
}
$x = "hello world";
$test = closureCreater();
$test();
$test(function(){ echo "closure test one"; });
$test(function(){ echo "closure test two"; });
$test(
function() use($x)
{ echo "<br />".$x;
});

大家不知道除了js,php中還有閉包吧,但這里的php的閉包就沒有js那般優(yōu)雅了,要引用還要使用use方法,對于一般的閉包上面那個例子應(yīng)該夠用了。
php指針
大家會不會很疑惑,除了C,還有別的小兄弟有指針?
current/pos 返回當(dāng)前被內(nèi)部指針指向的數(shù)組單元的值,并不移動指針。
key 返回?cái)?shù)組中當(dāng)前單元的鍵名,并不移動指針
next 將數(shù)組中的內(nèi)部指針向前移動一位,并返回移動后當(dāng)前單元的值。先移動,再取值。
prev 將數(shù)組的內(nèi)部指針倒回一位,并返回移動后當(dāng)前單元的值先移動,再取值。
end 將數(shù)組的內(nèi)部指針指向最后一個單元,并返回最后一個單元的值
reset 將數(shù)組的內(nèi)部指針指向第一個單元,并返回第一個數(shù)組單元的值
這可是很有用的,當(dāng)我們不知道一個數(shù)組的第一個元素下標(biāo)是什么鬼時(shí),current()的出現(xiàn)避免了我們的尷尬.
結(jié)束語
這里分享的都是在我工作學(xué)習(xí)中的問題,也是極有可能面試到的哦,這個是(一),我會在后面的工作學(xué)習(xí)中碰到問題及時(shí)分享的~