1. 程式人生 > >php學習筆記(一)--我們的第一段PHP程式碼

php學習筆記(一)--我們的第一段PHP程式碼

一、前提是我在Linux伺服器上已經安裝了PHP

這句程式碼非常神奇,一句話能變成一個網頁。是我們PHP入門的第一段程式碼。


<?php

phpinfo();

?>

剛剛我們看到這個程式碼已然生成了一個網頁。不明白其中的意思,現在我一點一點跟大家解釋。

<?php
//這句話是說明從此處【尖括號、問號、PHP】這5個字元開始,往下的部份是PHP程式碼。
?>

遇到上面的【問號、尖括號】說明PHP程式碼寫完了。再之後的部份,跟我PHP沒有關係啦。現在大家看會了?請問:phpinfo() 後面還接了一個分號(;),並且在phpinfo()的上一行和後一行,還有兩個回車符。請問這是什麼意思呢?

現在我告訴你答案:

phpinfo是一個函式(功能),這個函式(功能)會顯示一個當前電腦(伺服器)的詳細的PHP資訊。在後面會專門為大家講解phpinfo()這個函式。這個函式必須要大家記住!

電腦是一個很笨的東西。他需要我們人為的告訴他,程式碼寫完了。我們用分號(;)來告訴他程式碼寫完了。因此,只要我們寫完一段程式碼,就需要在後面加分號(;)。

而前後兩行的回車空行,是為了讓程式碼更加好看,避免疊在一起,讓人看著不舒服。其實,中間你有多少個回車空行都沒有關係的,保證好看就行了。PHP的語法直譯器(PHP最核心的部份)不會處理這些空行的。

注意事項:

php的程式碼部份全部要用半形的英文、很多人容易寫成全形的英文和符號造成PHP程式碼報錯。

PHP程式碼的最後一行可以加也可不加分號。由於很多學習者特別是初學者經常犯一個毛病:寫完一行程式碼不加分號。因此,容易報錯。我們通常在公司裡面規定:一行程式碼寫完,就必須要加分號。

PHP還可以有簡潔宣告模式,我們在這個階段以程式碼練習為主。關於環境配置問題,暫時不建議學習。在後面的章節中,我們會專門進行講解。以上,非常容易在實際開發中不小心造成錯誤。

我們在寫檔案index.php這個檔案命名的時候,只用英文半腳(a-zA-Z0-9_-)這些字元來命名檔案。檔案命名不要用中文,不要用特殊附號,不要中間加空格,嚴格區分大小。

二、讀過初中你就會變數

大家在讀初中的時候呀。老師經常會這麼教大家。請問,李磊和韓梅梅同學,假如:那麼x + y 等於多少呢?大家會義無反顧的回答。x + y 等於11。

x = 5
y = 6
接下來我們看下面的初中的數學知識,請問x + y 的結果是多少?
我估計大家也會義無反顧的回答:x + y 的結果為14。
x = 5
y = 6
x = 8
這就是變數!變數的幾個特點:
1.x = 5 將右邊值5,賦值給左邊的x
2.第二段x = 8,最後x + y 的結果等於14,說明x在從上到下的運算(執行)中,可以被重新賦值。

我們在PHP中的變數也是如此。不過有幾個特點:
1.必須要以$開始。如變數x必須要寫成$x
2.變數的首字母不能以數字開始
3.變數的名字區分大小寫
4.變數不要用特殊符號、中文,_不算特殊符號

5.變數命名要有意義(別寫xxx,aaa,ccc這種 變數名)

錯誤舉列:
錯誤:變數以數字開始

<?php
$123 = 345;
?>
錯誤:變數中有特殊字元,中文
<?php
//$a*d = 345;
//$中國 = 123;
?>
錯誤:變數命名沒有意義aaa容易數錯,也沒有含意
<?php
$aaaaaaa = 345;
?>
錯誤:變數嚴格區分大小寫 $dog 和 $Dog是PHP學院的變數,嘗試將$dog的值改為8.結果D寫成了大寫。
<?php
$dog = 5;
//重新修改$dog的值,將$dog改為8
$Dog = 8;
?>

正確舉例:
正確:變數不能以數字開始,但是數字可以夾在變數名中間和結尾

<?php//變數不能以數字開始,但是數字可以夾在變數名中間和結尾

$iphone6 = 5880;$iphone6plus = 6088;

$mony = $iphone6 + $iphone6plus;

echo $mony;?>

正確:變數不能有特殊符號,但是_(下劃線不算特殊符號)

<?php
$_cup = 123;
?>

注:你會發現程式碼是從上向下執行的。

$ 叫作美元符,英文單詞:dollar。PHP的變數必須以美元符開始。說明搞PHP有“錢”途。

三、echo 顯示命令

echo 是在PHP裡面最常用的一個輸出、顯示功能的命令。我們可以讓他顯示任何可見的字元。

<?php

echo 123;

?>

四、php註釋的學習  註釋的功能很強大,所謂註釋,漢語解釋可以為:註解。更為準確一些。因為程式碼是英文的、並且程式碼很長,時間長了人會忘。所以我們會加上註釋。
  註釋的功能有很多:
  1.對重點進行標註
  2.時間長了容易忘快速回憶,方便查詢
  3.讓其他人看的時候快速看懂
  4.還可以生成文件,程式碼寫完相關的文件就寫完了,提高工作效率
  5.註釋、空行、回車之後的程式碼看起來更優美
  6.註釋可用來排錯。不確定程式碼中哪一塊寫錯了,可以將一大段註釋,確定錯誤區間
  7.註釋中間的部份的內容,電腦不會執行它

  先給大家看看我們覺得優美的程式碼,整齊、規範、說明清楚、一看就懂。(不需要理解程式碼的含義):


再看看我們眼中覺得醜陋的程式碼,對齊醜陋不說,並且沒有功能說明(不需要理解程式碼的含義):


我們瞭解了註釋的好處,接下來我們來說PHP的註釋,註釋分別:

   單行註釋(只註釋一行)
   多行註釋(註釋多行)

   單行註釋

//   表示單行註釋
#    #號也表示單行註釋,用的比較少
/* 
多行註釋 這裡是註釋區域程式碼
 */

單行註釋舉例:

<?php

//宣告一部iphone6手機的價格變數
$iphone6_price = 6088;

注:通過上例我們知道,註釋通常寫程式碼上面。

多行註釋舉例:

<?php
/*
作者:PHP中文網
時間:2048.12.23
功能:這是一個假的多行註釋的例子
*/

/*
  宣告一個愛情變數
  $love 是指愛情
  愛情是一個變數,因為人的愛總是在發生變化
  所以,愛情變數的值為250
*/
$love = 250;

?>

五、php整型就是整數

我一直在講,不要被名詞的含義所嚇唬住。到底什麼是整型呀?所謂整型,就是大家數學中所學的整數。

整型——整數也,英文稱之:integer。英文簡寫:int

整型分為:

    1.10進位制

<?php
//為了方便大家記憶和前期學習,英文不好的朋友也可用拼音來宣告變數。以後再用英文來宣告變數也無所謂
//宣告變數 整數,英文 int
//$int = 1000;
$zhengshu = 1000;
echo $zhengshu;
?>

    2.8進位制 (瞭解,基本不用)

<?php
//8進位制的取值範圍最大為0-7,即0,1,2,3,4,5,6,7

$bajingzhi =  033145;
echo $bajingzhi;

?>

    3.16進位制(瞭解,基本不用)

<?php
//16進位制的取值範圍最大為0-f,即0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
$shiliu =  0x6ff;
echo $shiliu;
?>

整型(整數)在計算機裡面是有最大值和最小值範圍的。

六、php資料型別之布林(其實他就是中國易經)

布林型別就是:真和假。在英文把真和假翻譯過來就是:
true(真)

false(假)

因此,我們在PHP程式碼裡面可以這樣宣告。

<?php
//宣告一個變數(拼音)為布林
$buer = true;
//導明一個變數(英文)
$bool = false;
?>

七、php資料型別之字串

字串就是所有我們可見和不可見的字元,就是我們日常當中說的話,就是我想說:“小明好帥”或者“鳳姐,我愛你!”。字串,就是我想表達的一切讓人看到的字元。

例如可以看到的字元:

我願變成童話你,你愛的那個王子,有房有車有票子。 <html><title></title></html> ^@@@#@ my name is xiaoshenyang

以上可以見到的文字,HTML標籤、特殊字元和英文等等,我們都認為是字串。

在PHP語言中宣告字串有三種方式:
    1.用單引號宣告

    2.用雙引號宣告

    3.用字界符宣告(需要輸入非常大段的字串時使用)

注:不可見字元暫時不講解,因為,文字中無法表現,下面的實驗中逐漸注意即可。為了有更清晰的表現,也可以觀看本書配套的PHP學院出品關於字串的視訊。

1.單引號宣告 

用英文半腳的單引號,將字串包起來

<?php
//宣告字串變數$zhifu

$zhifu = '曾經有操蛋的愛情擺在我面前,我珍惜了。當我得到的時候才感到後悔莫及。如果非要在這段愛情前面加上一段三個字,我願意說三個字:滾犢子';

//你可以放XAMPP指定的目錄下,新建一個檔案叫str.php。然後訪問一下http://127.0.0.1/str.php試試。會不會顯示這句話。

echo $zhifu;

?>


2.雙引號宣告字串

在字串兩邊加雙引號。

<?php
//宣告字串變數$str
$str = "如果非要在滾犢子前面加上一個時間的話我願意是馬上。";

echo $str;
?>

3.字界符宣告
1).在變數後面的等號寫三個小於號(<<<)。
2).然後在<<<後面寫上字元(建議英文大寫字元)。如下例中的:ABC
3).然後換行寫上任意想寫的字元

4).寫完後,頂行。在行最開始處,再寫上<<<後面的字元和分號。如下例中的:ABC;

<?php

$dingjie = <<<ABC
  如果
       非要在這個滾犢子
   前
       面<br />
      加上一段
   <i>距離的話</i>
   我想說:<h1>思想有多遠,你就跟我滾多遠</h1>
ABC;
echo $dingjie;
?>

那雙引號和單引號有什麼區別呢?
【重要知識點】PHP面試題中,高概率面試題(建議背誦並實驗三遍以上)


    1.雙引號解析變數,但是單引號不解析變數。

    2.在雙引號裡面插入變數,變數後面如果有英文或中文字元,它會把這個字元和變數拼接起來,視為一整個變數。一定要在變          量後面接上特殊字元,例如空格等分開。

    3.如果在雙引號裡面插變數的時候,後面不想有空格,可以拿大括號將變數包起來。

    4.雙引號解析轉義字元,單引號不解析轉義字元。但,單引號能解析\' 和\

    5.單引號效率高於雙引號,儘可能使用單引號

    6.雙號和單引號可以互插!!!雙引號當中插入單引號,單引號當中插入變數,這個變數會被解析。

    7.神奇的字串拼接膠水——(.)點,用來拼接字串。

    8.我們將定界符宣告字串視為雙引號一樣的功能來看待。

實驗舉例

1.雙引號解析變數,但是單引號不解析變數

<?php
//宣告變數$shouji
$shouji = '為了蘋果手機去賣腎';
//在雙引號中放$shouji 然後echo 一下是什麼效果呢?
$str = "$shouji 會不會顯示呢?";
//輸入$str試試
echo $str;
?>

通過上邊的例子,我們發現。雙引號中間的變數夠執行顯示,我們將$str這個字串兩邊的雙引號,改為單引號試試,再看一次執行結果:


發現$shouji 直接顯示出來了,而不是雙引號的顯示結果。
通過上例,我們證明了:雙引號執行變數,而單引號不執行變數。我們得到一個重要結論:

雙引號需要解析變數,因此雙引號的效率沒有單引號高。我們如果為了更高的效率,我們通常使用單引號。

2. 在雙引號裡面插入變數,變數後面如果有英文或中文字元,它會把這個字元和變數拼接起來,視為一整個變數。可以在後面接上特殊字元,例如空格等分開。

<?php
$php = 'php中文網';

$str = "$phpaaaa";
//你會發現輸出$str,什麼都沒有在頁面中顯示
echo $str;
?>

但是,我們在$str 宣告的這個字串中將$huaqiangu 後面接個空格再接aaaa,程式碼如下:

<?php
$php = 'php中文網';
//中間加了空格喲
$str = "$php aaaa";

echo $str;
?>

我們把程式碼再改改:

<?php
$php = 'php中文網';
//中間加了空格喲
$str = "$php!aaaa";

echo $str;
?>

大家開啟一次頁面,執行了一次程式碼看看結果是不是變為了:
php中文網!aaaa

因此,證明了我們的第二項觀點。

3. 如果在雙引號裡面插變數的時候,後面不想有空格,可以拿大括號將變數包起來。

那,如果我不想在後面有空格有,有特殊符號,就想直接顯示變數$huaqiangu呢?——我們的解決辦法是用大括號把變數包起來。程式碼如下:

<?php
$php = 'php中文網';
//中間加了空格喲
$str = "{$php}aaaa";

echo $str;
?>

於是,大家會發現花千骨後面沒有了特殊符號,也沒有空格了,達到了我們想要的顯示結果,演示效果如上:

4. 雙引號解析轉義字元,單引號不解析轉義字元。但,單引號能解析\' 和\
第4個字串的注意事項比較難以觀察,轉義字元有一些,但最常用的有:
\n 回車
\t 縮排

我們來通過實驗先來理解\n和\t是什麼。

<?php
//宣告一個字串,記住是雙引號
$string = "每天來PHP中文網\n給夢想\t一個機會";
echo $string;
?>

為什麼看不出來\n和\t代表什麼含義,也看不出來雙引號解析了\n和\t呢?——因為,你沒有點選滑鼠右鍵檢視原始碼。我們來點選一下,再看看效果。

第一步:顯示網頁原始碼

第二步:檢視HTML原始碼顯示的結果:

大家來對比字串變數:

$string = "每天來PHP中文網\n給夢想\t一個機會";

\n在PHP學院的後面,在原始碼裡顯示的結果是跟按了回車鍵一樣的效果。

\t在給夢想和一個機會中間。顯示的結果是有幾個空格的效果。\t相當於我們在電腦上按了一個tab鍵效果。

但是,我們同樣執行一下上面的程式碼,但是$string雙引號改為用單引號:


你會發現——單引號中間的\t和\n直接顯示出來了,而沒有變成按一次回車鍵和按一次tab鍵後的效果。

因此:雙引號執行轉義字元而單引號不執行轉義字元。

5. 轉義字元\(反斜線的使用)

如果我們宣告一個變數$beizi,我們想要在$beizi宣告的雙引號中間加上一個雙引號顯示輸出怎麼辦?

<?php

//要在$beizi的字串中顯示一個雙引號怎麼辦?
$beizi = "多於絕大多數的人出生就是杯具,但是"我們在不斷的讓人生變為喜劇";

echo $beizi;
?>


如果真如上述所寫程式碼,程式碼會報錯。報錯結果如下:
因為字串:“多於絕大多數的人出生就是杯具,但是"我們在不斷的讓人生變為喜劇”必須寫在雙引號中間。而雙引號中間還有一個雙引號。也就是意味著字串宣告提前結束了,在“但是”處結束了。後面"我們在不斷的讓人生變為喜劇",電腦不認識。
這真是一個杯具!那麼辦?

答:我們需要將雙引號原有的意義去掉。再雙引號前面加上一個\(反斜線,計算機的專業名詞叫轉義字元),就可以了。


你可以再執行一下上面的程式碼,發現不再報錯了。同理可推,單引號當中要插入一個單引號顯示出來的時候,也可以在單引號宣告的字串中的單引號前面加上(反斜線,轉義字元),將單引號的意義(限定字元區間)去掉。

<?php

//要在$beizi的字串中顯示一個雙引號怎麼辦?
$shengyang = 'i\'m xiaoshengyang';

echo  $shengyang;
?>

6. 雙號和單引號可以互插!!!雙引號當中插入單引號,單引號當中插入變數,這個變數會被解析。

程式碼如下:

<?php

$legend = '猛虎';

$NoAlike = "心有'$legend',細嗅薔薇";

echo $NoAlike;

?>

7. 神奇的字串拼接膠水——(.)點,用來拼接字串。

<?php
$php = 'PHP中文網';
//中間加了空格喲
$str = "{$php}aaaa";

echo $str;
?>
上面這段程式碼是,我們曾經說過雙引號能夠解析變數,有一個問題:
效率沒有純單引號的高
那麼問題1:我想改為效率最高的方式應該怎麼辦?
問題2:我有多個字串,要拼接在一聲怎麼辦?

那,我們需要使用到神奇的膠水:(.)點,用來拼接字串。

<?php

$shixi = '大學4年要好好學習<br />';

$buran = '不然連實習的機會都沒有<br />';

$mimang = '把別人用來迷茫的時間拿到PHP中文網<br />';

$xuexi = '學習PHP<br />';

//我們可以把字串全部拼接起來。
echo $shixi . $buran . $mimang . $xuexi;

?>
因此,剛剛的問題一的程式碼我們可以改為:
<?php
$php = 'PHP中文網';
//中間加了空格喲
$str = $php . 'aaaa';

echo $str;
?>

8. 我們將定界符宣告字串視為雙引號一樣的功能來看待。

<?php

$weilai = '努力才有未來';
$mimang = '迷茫的原因是沒有目標';

$dingjie = <<<ABC
  如果
           $weilai
       非要\t在這"個滾"犢子
   前
           '$mimang'
       面<br />
      加上\n一段
   <i>距離的話</i>
   我想說:<h1>思想有多遠,你就跟我滾多遠</h1>
ABC;

echo $dingjie;
?>

你可以執行發現$weilai,$mimang,\t\n都可以執行,雙引號單引號都能顯示。這就是定界符的特點。
再宣告一次:字串的宣告每一項都必須記住,非常常用。並且面試題出現的概率非常高!

不可見字元:主要是計算機規定的一些特殊符號。例如:回車(\n)、縮排(\t)等。

八、php資料型別之​浮點型

所謂浮點型別,可以理解為:我們數學裡面的小數。

【注意】關於精度、取值範圍和科學型宣告不是學習的重點。因為此塊在實際開發中用的特別少。我們將此塊的知識點的學習標註為,瞭解級別。

宣告方式分為兩種:
普通宣告
科學宣告

普通宣告浮點數

<?php
//宣告變數$fl 的值為0.8873
$fl = 0.8873;
var_dump($fl);
?>

<?php
//宣告變數fudian的值為12121.3132
$fudian = 12121.3132;
echo $fudian;
?>

echo 直接輸出了12121.3132,而var_dump 輸出了0.8873,還顯示了變數$fl的型別為float。

var_dump() 是一個函式。向括號()中間插入變數。這個函式,會打印出來資料型別,還會對應顯示變數的長度和值。

九、php流程控制之if else語法

if和else語法
這是一個非常重要的章節,也是PHP當中的一個重要的語法。
【注意】我對這個語法的定義級別為:默寫級別。也就是你需要,閉著眼睛,都能夠寫出來的東西。

<?php
//我們定義一個泡到美女的變數($pao)為true,意思為泡到了
$pao = true;

if($pao){
 echo '我願意去死';
 echo '林志玲,我愛死你了。';
}else{
 echo '我不願意去死';
 echo '鳳姐,我肯定不會愛你的';
}
//if...else執行結束,後續程式碼
?>

我們將if和if...else組合成了四種基本語法,每一種都必須背下來。

<?php
if(布林條件)
   布林值為真(true)時執行,只能寫一行程式碼;
?>
<?php
if(布林條件)
   布林值為真(true)時執行,只能寫一行程式碼;
else
   布林值為假(false)時執行,只能寫一行程式碼;
?>
<?php
if(布林條件){
    布林值為真(true)時執行,可寫多行程式碼;
}
?>
<?php
if(布林條件){
    布林值為真(true)時執行,可寫多行程式碼;
}else{
   布林值為假(false)時執行,可寫多行程式碼;
}
?>

很多人喜歡買彩票,我們拿買彩示的過程來寫個if的例子。

<?php
//定義一下中獎變數,變數的值為true,表示中獎了
$zhongjiang = true;
//由於$zhongjiang 結果為true,所以顯示了:“買個房子”
//可以改為false試試執行結果,如果為false的話,不會執行echo '買個房子';

if($zhongjiang){
   echo '買個房子';
}
//後續程式碼
echo '該幹嘛幹嘛';
?>

十、php資料型別之 NULL型別

空在英文裡面表示是null,它是代表沒有。空(null)不是false,不是0,也不是空格。
【重點】知道null產生的三種情況,學習empty 和 isset兩個函式的區別。
主要有以下三空情況會產生空(null)型別:
    1.通過變數賦值明確指定為變數的值為NULL
    2.一個變數沒有給任何值
    3.使用函式unset()將變數銷燬掉

我們用程式碼來演示一下。




<?php
//宣告一個變數$iphone的值為字串的手機
$iphone = '手機';
//unset銷燬掉一個變數unset($iphone);
var_dump($iphone);
?>

接下來我們來講解兩個跟null相關的函式,這兩個函式非常常用,我們將級別定義為【默寫級別】。

empty()可以向括號中間傳入一個變數。這個變數的值如果為false或者為null的話,返回true。

<?php

$apple = null;
if(empty($apple)){
    echo '執行了真區間,鳳姐,我愛你';
}else{
   echo '行了假區間,你想鳳姐了';
}
?>

上述實驗證明,$apple為null。將apple放至empty中間。結果執行了真區間。

isset()可以向括號中間傳入一個或者多個變數,變數與變數間用逗號分開。只要有有一個變數為null,則返回false。否則,則返回true。


<?php
$one = 10;
$two = false;
$three = 0;
$four = null;

$result = isset($one , $two , $three , $four);
//執行看看結果,是不是
var_dump($result);

?>

unset()這個函式的功能是毀掉變數。unset(變數)括號中間插入想要毀掉的變數名,這個變數就會被毀掉。

十一、php資料型別之資源型別

資源型別
資源型別很多初學者覺得比較難以理解。因為資源型別打印出來只能夠看到一個英文的resource。其他的什麼在電腦上都不能顯示出來,而他有客觀存在。
其實,資源型別很簡單。我們針對詞來進行說明。
電腦裡面的資源是指:
    1.word,excel等檔案
    2.有人收藏的美女圖片和我們的自拍照片等圖片
    3.音樂
    4.某些人愛看的AVI小電影
    5.開啟的網頁
    6.資料庫
      ... ...等等
我們開啟一個圖片,用PHP來操作它,我們就是操作的一個資源。
我們開啟的資料庫連線,我們需要連線資料庫,資料庫就是我們操作的資源。

包括網路連線,連線後傳送郵件,我們也可以認為是一個資源。

<?php
//PHP操作圖片需開啟配置檔案中 extension=php_gd2.dll
//==================================================生成圖片
$imgname = "./test.png";
//根據給定路徑圖片名或 web 路徑建立 png 圖片模板物件,圖片不存在會報錯,需加 @
$im = @imagecreatefrompng ( $imgname );
//對應的建立jpg圖片的方法為 imagecreatefromjpeg ,例
//$im = imagecreatefromjpeg("http://wx.qlogo.cn/mmopen/Q3auHgzwzM4fA6602v35iaPhicn4NerIoHhHIsM6uBFjDnbn6saxic3QJBibmibterqicNwiajic1ff8Y2sPhj1ictV0wMw/096");
if (! $im) {
 //=======================建立圖片物件
 //如果指定圖片不存在,則建立指定大小的空圖片模板物件,寬800,高500
 $im = ImageCreate ( 800, 500 );
 //第二種建立圖片方法
 $im = ImageCreateTrueColor(800, 500);
 
 //=======================建立顏色物件
 //依據一個模板物件,生成顏色物件,0為red值,100為green值,30為blue值
 //ImageCreate 建立的物件在此會直接將顏色填充至模板物件中,ImageCreateTrueColor 建立的物件則只建立顏色物件,不填充
 $bgc = ImageColorAllocate ( $im, 0, 100, 30 );
 $tc = ImageColorAllocate ( $im, 0, 0, 0 );
 
 //=======================填充顏色
 //為圖片物件填充矩形顏色,如果空模板物件不填充顏色則為黑色
 //100,50對應矩形填充區域左上角的橫縱座標,150,200對應矩形右下角的橫縱座標
 //這裡座標對ImageCreate模板物件不起作用,全域性填充,對ImageCreateTrueColor起作用。
 ImageFilledRectangle ($im, 100, 50, 150, 200, $bgc);
 //第二種填充方法200,100同樣為左上角橫縱座標,但這裡座標對兩種方法建立的模板物件都不起作用,完全填充
 ImageFill($im, 200, 100, $bgc);
 
 //=======================填充文字
 //在模板物件中新增文字兩種方法
 //40字型粗度,50字型左邊距距離,5字型上邊距距離,$tc字型顏色,這種方式只能填充英語,填中文亂碼
 ImageString ( $im, 40, 50, 5, "just is English code", $tc );
 //新增中文18為字型大小,0字型旋轉程度,100左邊距距離,200上邊距距離,專案目錄下要有"MSYH.TTF"這個字型檔案
 imagettftext($im, 18, 0, 100, 200, $tc, "MSYH.TTF", "填充中文");
}



//==================================================合成圖片
// 載入圖象
$img1 = imagecreatefromjpeg("image1.jpg");
$img2 = imagecreatefromjpeg("064.jpg");

//方法一合成圖象 ,將引數二合成到引數一中,500離主圖片左邊距,400離主圖片上邊距,0新合圖片內右邊距偏移量,10新合圖片內下邊距偏移量, 243合到引數一後所佔位置寬,90合到引數一後所佔位置高
//imagecopy($img1,$img2,500,400,0,10,243,90);
//得到原始大圖片尺寸
$imgage = getimagesize("064.jpg");
$src_W = $imgage[0]; //獲取原圖片寬度
$src_H = $imgage[1]; //獲取原圖片高度
//方法二合成圖象並改變大小,500,400,0,10,與imagecopy作用一致,200分別是縮小後寬,高,$src_W,$src_H原圖寬,高
//imagecopyresampled($img1, $img2, 500,400,0,10, 200, 200, $src_W, $src_H);
//方法三,並且合透明圖必須用此方法,別的合成方法合成後該透明的地方無法透明
//500,400,0,10, 243,90,與imagecopy作用一致,100表示引數二在引數一中透明程度,範圍0~100,0完全透明,100完全不透明
imagecopymerge($img1, $img2, 500,400,0,10, 243,90, 100);



//==================================================合成圓角圖片
//每次生成圓的四個角中一個角,中心透明,邊角有色的圖片,用於合成
function get_lt($halfWidth) {
 //根據圓形弧度建立一個正方形的影象
 $img = imagecreatetruecolor($halfWidth, $halfWidth);
 //影象的背景
 $bgcolor = imagecolorallocate($img, 223, 0, 0);
 //填充顏色
 imagefill($img, 0, 0, $bgcolor);
 //定義圓中心顏色
 $fgcolor = imagecolorallocate($img, 0, 0, 0);
 // $halfWidth,$halfWidth:以影象的右下角開始畫弧
 // $halfWidth*2, $halfWidth*2:已寬度、高度畫弧
 // 180, 270:指定了角度的起始和結束點
 // fgcolor:指定畫弧內的顏色
 imagefilledarc($img, $halfWidth, $halfWidth, $halfWidth*2, $halfWidth*2, 180, 270, $fgcolor, IMG_ARC_PIE);
 //將圖片中指定色設定為透明
 imagecolortransparent($img, $fgcolor);
 //變換角度
 // $img = imagerotate($img, 90, 0);
 // $img = imagerotate($img, 180, 0);
 // $img = imagerotate($img, 270, 0);
 // header('Content-Type: image/png');
 // imagepng($img);
 return $img;
}

$img1 = imagecreatefrompng("vote_2.png");
$img2 = imagecreatefromjpeg("064.jpg");
//獲取圖片尺寸
$imgSize = getimagesize("064.jpg");
$image_width = $imgSize[0];
$image_height = $imgSize[1];

//圓角長度,最好是圖片寬,高的一半
$halfWidth = $image_width / 2;

//獲取四分之一透明圓角
$lt_img = get_lt($halfWidth);

//改造$img2 左上角圓角透明
imagecopymerge($img2, $lt_img, 0, 0, 0, 0, $halfWidth, $halfWidth, 100);
//旋轉圖片
$lb_corner = imagerotate($lt_img, 90, 0);
//左下角
imagecopymerge($img2, $lb_corner, 0, $image_height - $halfWidth, 0, 0, $halfWidth, $halfWidth, 100);
//旋轉圖片
$rb_corner = imagerotate($lt_img, 180, 0);
//右上角
imagecopymerge($img2, $rb_corner, $image_width - $halfWidth, $image_height - $halfWidth, 0, 0, $halfWidth, $halfWidth, 100);
//旋轉圖片
$rt_corner = imagerotate($lt_img, 270, 0);
//右下角
imagecopymerge($img2, $rt_corner, $image_width - $halfWidth, 0, 0, 0, $halfWidth, $halfWidth, 100);

//生成紅色
$red = imagecolorallocate($img2, 223, 0, 0);
//去除引數二中紅色設成透明
imagecolortransparent($img2, $red);

imagecopymerge($img1, $img2, 117,37,0,0, 64, 64, 100);



//設定http輸出格式
//header ( "Content-type: image/png" );
header("Content-type: image/jpeg");

//將二進位制檔案流輸出到網頁
//imagePng ( $im );
//如果是jpg二進位制流用 imagejpeg 輸出圖象,並且後面加路徑則直接生成儲存圖片,不再在頁面輸出
//如果已有圖片則覆蓋生成
//imagejpeg($img1, "new.jpg");
imagejpeg($img1);

//登出模板物件
ImageDestroy($im);
ImageDestroy($img1);
ImageDestroy($img2);
?>

十二、php資料型別之檢視和判斷資料型別

我們知道了一個數據的型別,才能進行下一步操作。後面的時候,大家可以學習到更多的知識——自定義功能(函式)。
我們來做一個場景模擬:(注:眼前不用會寫這個函式,以後會教大家)
假設,我們可以寫一個智慧的功能(函式),它讓有一個功能,就是開啟一個裝有學生成績的電子表格。這個函式非常先進。
    1.只有一個人的時候,就返回一個人的成績,成績是整型或者浮點型變數。
    2.有2個或兩個以上人的時候,返回一個數組型別變數,陣列中裝有多個人的成績
    3.如果沒有人的時候,則返回布林值的變數,變數值為false
通過上面的一個場景模擬,我們知道了,一個函式(功能)有可能返回不同的資料型別。因此,我們可以根據不同的型別來做不同的事情。
判斷資料型別很重要,我們需要嚴格掌握。

【默寫級知識點】顯示型別的函式、得到型別的函式、判斷型別的函式

檢視資料型別
   
1.gettype(傳入一個變數) 能夠獲得變數的型別

    2.var_dump(傳入一個變數) 輸出變型別和值

<?php
  //宣告一個變數88.8,你可以自己多做幾次實驗換成其他型別看看$type輸出是多少
  $float = 88.8;
  $type = gettype($float);

  echo $type;

?>

<?php

//多換幾個型別試試
$str = '你喜歡尊上還是喜歡殺仟陌?';

var_dump($str);
?>

判斷資料型別
我們使用is_* 系列函式。 is_types這一系列的函式,來進行判斷某個東西是不是某個型別。如果是這個型別返回真,不是這個型別返回假。
is_int 是否為整型
is_bool 是否為布林
is_float 是否是浮點
is_string 是否是字串
is_array 是否是陣列
is_object 是否是物件
is_null 是否為空
is_resource 是否為資源
is_scalar 是否為標量
is_numeric 是否為數值型別

is_callable 是否為函式

<?php
//is_* 系列函式有個特點,就是如果是這個型別就返回的是真。不是這個資料型別就返回的是假
//宣告型別為假
$fo = false;

if(is_bool($fo)){
    echo '第一個真';
}else{
    echo '第一個假';
}
echo "<br/>";

//檢查未宣告的變數$p是否為空,為空就執行真區間
if(is_null($p)){
    echo '第二個真區間';
}else{
    echo '第二個假區間';
}
echo "<br/>";

//字串型別的數值,看看執行的是真還是假
$str = '18.8';
if(is_numeric($str)){
    echo '第三個真區間';
}else{
    echo '第三個假區間';
}
echo "<br/>";
//把sca的值換成整型、浮點、布林和字串試試
$sca = true;
//如果為標量,執行真區間
if(is_scalar($sca)){
    echo '第四個真區間';
}else{
    echo '第四個假區間';
}
echo "<br/>";
//換成echo,is_int試試,為什麼echo執行假區間呢?
if(is_callable('var_dump')){
    echo '第五個真區間';
}else{
    echo '第五個假區間';
}

?>


注:is_types 很好記。is_ 在前後面跟型別即可。
變數:整型(int) 浮點(float)、布林(bool)、字串(string)
混合型別: 陣列(array)、物件(object)
特殊型別:空(null)、 資源(resouce)、回撥(callback)
為什麼最後的實驗中echo執行假區間呢?

答:因為echo 不是函式,是基本語法。大家眼前可以不用理解函式和基本語法的區別。瞭解和不瞭解在實際開發中沒有影響。知道有這個知識點就行。

十三、php資料型別之自動轉換和強制轉換

PHP在PHP 5.x階段都是完全的弱型別的程式語言。所謂弱型別,就是在宣告變數的時候,不需要指定變數的型別。我要宣告一個整型的變數,我不用在前面非得寫上型別,再寫變數。
而PHP 7 的效能有很大的提高。實際測試的結果,PHP 7的效能與PHP5.6相比,提升了效能接近200%。在PHP 7 中有些地方,我們可以強制指定型別,也可以不用強制指定型別來宣告變數。
我們接來下來講強制型別轉換和自動型別轉換兩個部份。

【默寫級別】布林值的自動型別轉換、強制型別轉換的英文單詞

布林值的自動型別轉換
自動型別轉換,就是資料型別在某些情況下,自動會變為其他的型別參與運算。自動型別轉換的發生時機是:運算和判斷的時候某些值會自動進行轉換。
下面的情況是布林值判斷時的自動型別轉換:
1,整型的0為假,其他整型值全為真
2, 浮點的0.0,布林值的假。小數點後只要有一個非零的數值即為真。
3,空字串為假,只要裡面有一個空格都算真。
4,字串的0,也將其看作是假。其他的都為真
5,空陣列也將其視為假,只要裡面有一個值,就為真。
6,空也為假
7, 未宣告成功的資源也為假
我們針對以上針理的規則一項一項來做實驗看看結果。

1,整型的0為假,其他整型值全為真


2, 浮點的0.0,布林值的假。小數點後只要有一個非零的數值即為真。

<?php
//浮點型別的的0,換成其他值試試
$bool = 0.0;
if($bool){
   echo '美女美女我愛你';
}else{
   echo '鳳姐鳳姐愛死我,執行假區間咯';
}
?>

3,空字串為假,只要裡面有一個空格都算真。

<?php
//空字串,中間沒有空格喲。實驗完加個空格試試
$str = '';
if($str){
    echo '美女美女我愛你';
}else{
    echo '鳳姐鳳姐愛死我,執行假區間咯';
}
?>

4,字串的0,也將其看作是假。其他的都為真

<?php
//0這個字串喲,試試其他值看看
$str = '0';
if($str){
    echo '美女美女我愛你';
}else{
    echo '鳳姐鳳姐愛死我,執行假區間咯';
}
?>

5,空陣列也將其視為假,只要裡面有一個值,就為真。

<?php
//這個陣列當中啥也沒放
$arr = array();
if($arr){
    echo '美女美女我愛你';
}else{
    echo '鳳姐鳳姐愛死我,執行假區間咯';
}
?>

6,空也為假

<?php
//聲明瞭一個空的變數$bool
$bool = null;
if($bool){
    echo '美女美女我愛你';
}else{
    echo '鳳姐鳳姐愛死我,執行假區間咯';
}
?>

7, 未聲成功的資源也為假

<?php
//下面這段程式碼會顯示警告,可忽略。暫時只需要對著實驗知道效果即可:未聲成功的資源也為假
//下面這一塊瞭解意思就行:開啟adasfasfasfdsa.txt這個不存在的檔案
$res = fopen('adasfasfasfdsa.txt','r');
if($res){
    echo '美女美女我愛你';
}else{
    echo '鳳姐鳳姐愛死我,執行假區間咯';
}
?>

其他型別的自動型別轉換
自動型別轉換在運算時也可以發生。跟所有我們總結的規律和觀點一樣:先總結、後實驗。

只有標量在運算時會產生以下的自動型別轉換:


<?php
//布林變整型參與運算
$fo = true;
$result = $fo + 10;
//$result 結果為整型的11,因為$fo布林的true變為了1
//如果$fo的值為0
var_dump($result);
//字串型別
$str = '419不要愛';
$result = $str + 1;
//結果為420。因為將$str變為了整型的419參與運算
//將419放在字串中間和結尾試試
var_dump($result);
?>


總結:
布林值的true參與運算是會變成整型或者浮點的1布林值的false參與運算是會變成整型或者浮點的0字串開始處是整型或浮點型別的字元,會轉成對應的型別參與運算
強制型別轉換
強制型別轉換有三種方式:
    1.用後面的三個函式可以完成型別轉換,intval()、floatval()、strval()
    2.變數前加上()裡面寫上型別,將它轉換後賦值給其他變數
    3.settype(變數,型別) 直接改變數本身

我們來進行實驗:

intval()、floatval()、strval()轉換

<?php
    $float = 1.23;
    $result = intval($float);
    //看看結果是不是變了?
    var_dump($result);
    //鴨脖子為整型的5
    $yabozi = 5;
    $re = floatval($yabozi);
    var_dump($re);
    //定義整型的變數
    $yabozi = 23;
    $bian = strval($yabozi);
    //強制變成字串試試
    var_dump($bian);
?>

變數前加上()裡面寫上型別,將它轉換後賦值給其他變數

<?php
   //定義一個變數,我們來變化一下試試
   $transfer = 12.8;
   //把浮點變為整型
    $jieguo = (int)$transfer;
    var_dump($jieguo);
   //把浮點變為布林
   $jieguo = (bool) $transfer;
   var_dump($jieguo);
   //把布林變整型
   $bool = true;
   $jieguo = (int)$bool;
   var_dump($jieguo);
    //把浮點變陣列
   $fo = 250;
   $jieguo = (array)$fo;
   var_dump($jieguo);
   //其他的操作方式,按照文字總結的規律你來試試
?>

settype(變數,型別) 直接改變數本身

<?php
    //定義浮點變為整型
    $fo = 250.18;
   //settype第二個引數是int,你實驗的時候要記得第二個引數要為字串型別
    settype($fo,'int');
    //輸出看看結果
    var_dump($fo);
?>

【你試試】以下是強制型別轉換時的特點,每一項你做實驗看看對不對:
    1.空轉為整型會為整型的0
    2.空轉為浮點會為浮點的0
    3.空轉為字串會為空字串‘’
    4.浮點的123.0轉為字串會為字串123
    5.浮點的123.2轉為字串會為字串的123.2
    6.浮點即使小數點再大,它都會被幹掉,會舍掉小數點後面的值
    7.如果字串轉為整型的時候,如果數值在前面,會將前面的數值拿出來做為整型的轉換值。
    8.settype(變數,'null'); 等價於 unset()一個變數

    9.$目標變數 = (型別)$操作變數 只會改變目標變數的型別,不會改變原變數的型別,Settype是改變原值

<?php
      //小可愛,記得自己做實驗,驗證上面的9點喲
    $t=12.9;
    settype($t,'int');
    var_dump($t);
?>

十四、php常量和變數之用常量限制使用者跳過某些檔案

【重點知識】知識級別我們定義為:默寫級
常量的使用範圍非常廣泛。我們在以後,定義我們的工作目錄、定義一些特點的帳戶密碼、版本號等我們都會使用到常量。所以這一塊的知識,非常重要。
常量在程式碼中的定義、書寫方式:
define(常量名,常量值)
注:
    1.常量值只能為上一章中我們講到的標量。
    2.常量名可以小寫,但是通常大寫
    3.常量名可以不加引號,但是通常加上引號。
    4.在字串中呼叫常量的時候,必須在引號外面
    5.常量名建議只用字母和下劃線
我們用程式碼來實驗一下:

1.定義和呼叫一次常量試試

<?php

define('MY_NAME','PHP中文網');

echo MY_NAME;
//下面是錯誤的呼叫方式
echo '我的名字是MY_NAME';
//正確的呼叫方式該這麼寫
echo '我的名字是' . MY_NAME;
?>

2.注意專案實驗

<?php
//其實可以小寫,但是不好區分,所以我們規定通常大寫
define('xiaoxie',true);
echo xiaoxie;

//常量可以在外面不加引號
define(YH,'不要對未來迷茫,迷茫的時候靜下心來coding');
echo YH;

//只能用標量,我在後面用了一個數組,大家學一下就行,會報錯的喲
define('BIAO',array(1,2,3));
echo BIAO;
?>

此外,系統還為我們準備了一些內建的常量。這些常量都是規定好的。我們先熟悉幾個,還有更多的系統常量我們學習完上冊,入門後再慢慢的增加和學習。


defined()函式來做安全機制
此處知識,可以眼前不用掌握。學習完函式後,再來看本部份程式碼也可以。
defined()我們來學習這種用法,主是是為了防止其他人繞過安全檢查檔案。
函式:defined(常量)
功能:向函式的括號後面傳入常量,如果常量定義了就返回true,否則返回false;

【情景模擬】假設,我們的這套線上電子商城的軟體需要付錢,檢查是否付費是通過對軟體授權檢查來完成的,而檔案version.php中就有檢查授權的功能,我們在軟體中規定,沒有授權檢查檔案version.php就不能使用這個軟體。所有的程式碼都包含了version.php。並且為了防止有人盜版,我還可以把version.php的程式碼進行了加密。
我們有兩個檔案:
1.一個檔案中間有版本號,版本宣告和授權宣告。檔名為version.php
2.一個檔案中有具體的業務功能。例如:使用者註冊、登陸等,檔名為users.php
我們該怎麼做呢?——也就是說不包含 version.php檔案就不讓,執行users.php之後的程式碼。
我們來進行實驗:

version.php檔案

<?php

//此處是檢查是否是否授權的業務部份程式碼xxxx
define('AUTH',true);

//略過模擬程式碼xxx行
echo AUTH;
?>

users.php

<?php
//嘗試將include 'version.php'這一行程式碼註釋