【原】PHP從入門到精通2小時【圖文並茂】
原創內容,轉載請註明。
主要內容:
- 搭建PHP開發環境
- 第一個helloworld程式
- 變數
- 全域性變數
- 迴圈結構
- 函式
- 陣列
- 面向物件程式設計
- 繼承
- 介面
- 多型
- 日誌
- 檔案的讀寫
- 時間格式和時區
- 建立圖形
- 從遠端獲取圖形
- 生成二維碼
- php與資料庫mysql的連線
- mysql資料庫面向物件程式設計
- cookie技術
- 檢視cookie
- session技術
- 檢視session
- 檔案上傳
PHP(Hypertext Preprocessor)PHP超文字預處理程式,是一種嵌入HTML的指令碼語言,執行在伺服器。
如果有一定的程式設計基礎,1小時之內看完so easy!
搭建PHP開發環境
PHP開發環境主要3部分:伺服器Apache,程式語言PHP,資料庫MySQL。搭建開發環境,直接使用XAMPP整合安裝就可以。
XAMPP=Apache+MySQL+PHP+Perl,X表示的是跨平臺。
官網下載安裝即可:https://www.apachefriends.org/zh_cn/index.html
( 安裝太簡單了,沒有什麼可說的,不過如果以前安裝過tomcat,apache,MySQL等,xampp的部分功能可能不能使用,解決辦法網上很多,不再贅言)
第一個helloworld程式
php可以使用note++進行編輯。
helloworld.php
<?php echo "hello world!"; ?>
然後執行XAMPP的控制面板,點選Apache的start,綠色就是正常運行了。
然後將helloworld.php檔案放在路徑:C:\xampp\htdocs
瀏覽器輸入:http://localhost/helloworld.php
ok,我們的第一個PHP程式就完成了。
ps:以後我們將php檔案放在一個單獨的資料夾basic中,便於管理
變數
變數,儲存資料的容器,在php中,使用$(美元符號)開頭的就是變數,可以給變數賦值,或者輸出變數的值。
另外,php語句以;(英文狀態半形的分號)結束。
<?php //$定義變數 $text='this is a text'; //輸出變數 echo $text; ?>
全域性變數
全域性變數就是在所有的php檔案範圍內都可以使用的變數(變數的概念,儲存資料的容器)
最常用的全域性變數有$_GLOBAL,$_SERVER,$COOKIE,$_SESSION,__FILE__(注意是2個下劃線),__LINE__
php檔案是嵌入到html、的一種語言,執行在伺服器端,可以和html語言混合書寫。
這裡的.(點號)表示拼接字串,echo可以輸出字串。
global.php
<?php echo '當前執行指令碼檔名:'.$_SERVER['PHP_SELF'].'<br/>'; echo '當前執行指令碼根目錄:'.$_SERVER['DOCUMENT_ROOT'].'<br/>'; //單行註釋 echo '當前執行指令碼絕對路徑:'.$_SERVER['SCRIPT_FILENAME'].'<br/>'; //print_r($_SERVER); //返回當前檔名,行號 echo '當前檔名稱:<strong>'.__FILE__.'</strong><br/>'; echo '當前行號:<strong>'.__LINE__.'</strong><br/>'; ?>
開啟瀏覽器,輸入:http://localhost/basic/global.php
迴圈結構
迴圈主要就是for迴圈,和while迴圈,可以重複執行某一個動作,直到滿足條件
for(初始化計數值; 滿足條件就繼續執行 ; 執行後的操作,將計數值+1){ 執行的程式碼; }
while( 滿足條件就繼續執行){ 執行的程式碼; 將計數值+1 ; }
for_while.php
<?php //for迴圈 for($i=0;$i<10;$i++){ echo 'good! '; } echo '<br/>'; //while迴圈 $j=0; while($j<5){ echo 'do... '; $j++; } ?>
開啟瀏覽器,輸入:http://localhost/basic/for_while.php
函式
這是任何一種語言的重點,包括php
func.php
<?php sum(1,3); //定義求和函式,帶2個引數 function sum($a,$b){ echo "$a+$b=".($a+$b);//雙引號會輸出變數,單引號輸出字串 echo '<br/>'; echo '$a+$b='.($a+$b); } ?>
?>
開啟瀏覽器,輸入:http://localhost/basic/func.php
陣列
陣列分為索引陣列,關聯陣列,使用print_r(陣列)來輸出陣列內容
var_dump(陣列)檢視詳細資訊
可以使用foreach(陣列 as 鍵 = > 值){ } 來迴圈輸出陣列
array.php
<?php //索引陣列 $arr=array('小李','25','男','開發工程師'); print_r($arr); //Array ( [0] => 小李 [1] => 25 [2] => 男 [3] => 開發工程師 ) //關聯陣列 $array=array('姓名'=>'小明','年齡'=>'25','性別'=>'男','職業'=>'開發工程師'); print_r($array); //Array ( [姓名] => 小明 [年齡] => 25 [性別] => 男 [職業] => 開發工程師 ) echo '<br/>'; //輸出詳細資訊 var_dump($arr); /*array(4) { [0]=> string(6) "小李" [1]=> string(2) "25" [2]=> string(3) "男" [3]=> string(15) "開發工程師" }*/ echo '<br/>'; //迴圈輸出陣列 foreach($array as $k=>$v){ echo "鍵值對:$k --> $v".'<br/>'; } /** 鍵值對:姓名 --> 小明 鍵值對:年齡 --> 25 鍵值對:性別 --> 男 鍵值對:職業 --> 開發工程師 */ ?>
以下內容就是程式設計技術的分水嶺,面向物件程式設計
面向物件程式設計
在面向物件程式設計的思想中,有最重要的2句話:
- 類用來封裝程式碼
- 物件用來封裝資料
首先來學習怎麼樣定義一個類:
類名前+class,類中有public的屬性,如$name,$sex,$age,還有public的方法say()
在類中,只要new一個物件,就自動會執行__construct構造方法
一個類被銷燬,或者程式執行完畢,自動執行__destruct()解構方法
類的屬性和方法,通過物件->指標符號呼叫
$this 表示當前物件。
classMehtod.php
<?php //定義一個類 class ren{ public $name; public $sex; public $age; //成員方法 public function say(){ echo '我的名字是'.$this->name.',性別是'.$this->sex.','.$this->age.'歲了<br/>'; } //構造方法,只要new 就會執行 function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; echo '構造物件'.$this->name.'<br/>'; } //解構方法,程式結束,物件銷燬時執行 function __destruct(){ echo '解構物件'.$this->name.'<br/>'; } } //例項化物件 $xiaoli=new ren('小李','男','25'); $xiaoli->say(); /*輸出: 構造物件小李 我的名字是小李,性別是男,25歲了 解構物件小李 */ ?>
繼承
面向物件程式設計思想中,有3個核心概念:
- 封裝
- 繼承
- 多型
封裝其實就是類,定義類就是將程式碼封裝起來了。
其次就是繼承!
繼承的關鍵字:extends
$this 表示當前物件。
一個B類繼承另外一個類A,B會自動擁有A的所有的屬性和方法,而不用再書寫一遍(繼承的思想,程式設計師懶惰的直接體現,要是程式設計師也有一個有錢的爹可以繼承財富該多好。。。)
inherit.php
<?php //申明tool類 class tool{ function on(){ echo '<br/>啟動<br/>'; } function run(){ echo '<br/>執行<br/>'; } function off(){ echo '<br/>關閉<br/>'; } } //繼承inherit class fan extends tool{ function app(){ $this->on(); $this->run(); $this->off(); } } //簡化使用 $haierFan=new fan(); $haierFan->app(); ?>
介面
介面是一種更加高階的繼承方法
定義介面的關鍵字:interface
實現(繼承)介面的關鍵字:implements
介面中的所有的方法都是預設public的,而且只要定義,不用實現(在實現類中實現具體方法)
interface.php
<?php //申明介面 interface tool{ function on(); function run(); function off(); } //實現介面 class fan implements tool{ public $name; function on(){ echo '<br/>'.$this->name.'風扇啟動<br/>'; } function run(){ echo '<br/>'.$this->name.'風扇執行<br/>'; } function off(){ echo '<br/>'.$this->name.'風扇關閉<br/>'; } function __construct($name){ $this->name=$name; } } //繼承inherit class haierfan extends fan{ function app(){ $this->on(); $this->run(); $this->off(); } } //例項化 $fan=new fan('美的 '); $fan->on(); $fan->run(); $fan->off(); echo '<br/> ------------分割線------------ <br/>'; //例項化 $haierfan=new haierfan('海爾 '); $haierfan->app(); ?>
多型
作為面向物件程式設計的3大思想之一,多型也是一種高階技能
多型一般都是通過介面來實現的
就是呼叫同一個方法,執行得到的結果卻不同!!!
通過輸入引數的不同,執行結果不同,這就是多型
polymorphism.php
<?php //申明介面 interface tool{ function on(); function run(); function off(); } //實現介面 class fan implements tool{ public $name; function on(){ echo '<br/>'.$this->name.'風扇啟動<br/>'; } function run(){ echo '<br/>'.$this->name.'風扇執行<br/>'; } function off(){ echo '<br/>'.$this->name.'風扇關閉<br/>'; } function __construct($name){ $this->name=$name; } } //實現介面 class engine implements tool{ public $name; function on(){ echo '<br/>'.$this->name.'發動機啟動<br/>'; } function run(){ echo '<br/>'.$this->name.'發動機執行<br/>'; } function off(){ echo '<br/>'.$this->name.'發動機關閉<br/>'; } function __construct($name){ $this->name=$name; } } //狀態類 class toolStatus{ function ts($tool){ $tool->on(); $tool->run(); $tool->off(); } } //應用多型polymorphism $fan=new fan('海爾 '); $engine=new engine('奧迪 '); $toolStatus=new toolStatus(); $toolStatus->ts($fan); $toolStatus->ts($engine); ?>
這又是一條牛逼的分割線,php基本功能就是以上的內容,下面是一些更加高階玩法。
日誌
log.php
<?php /* 1、設定php.ini檔案 2、日誌分類 3、檢視日誌 */ //生成執行日誌 error_log("FORM ".__FILE__." ERROR LINE:".__LINE__); /*需要設定正確的日誌路徑,確保路徑存在 [15-Sep-2018 09:31:45 Europe/Berlin] 這是來自C:/xampp/htdocs/basic/log.php 的一段自定義的報錯日誌資訊 */ //生成系統日誌 openlog('PHP7',LOG_PID,LOG_USER); syslog(LOG_WARNING,'向syslog傳送自定義資訊'); closelog(); try{ $a=10; if(isset($b)){ echo "程式正常執行"; }else{ throw new Exception(); } }catch(Exception $e){ ERROR_LOG("錯誤程式碼所在路徑:".$e->getFile()); ERROR_LOG( "錯誤程式碼所在行號:".$e->getLine()); } echo "<br/>程式執行完畢<br/>"; /* [15-Sep-2018 09:44:41 Europe/Berlin] 錯誤程式碼所在路徑:C:\xampp\htdocs\basic\log.php [15-Sep-2018 09:44:41 Europe/Berlin] 錯誤程式碼所在行號:26 */ //輸出日誌 依賴於檔案的讀寫操作,後續將會學習 ?>
檢視執行日誌
檢視系統日誌
顯示亂碼主要是編碼字符集的問題,將log.php檔案儲存為ANSI格式即可看到中文正常顯示,解決方法網上很多。
檔案的讀寫
fileIO.php
<?php //讀取檔案 //readfile('./test.txt'); //訪問遠端檔案,需要設定php.ini的 allow_fopen=On $html=file_get_contents('http://www.baidu.com'); //輸出html頁面 //echo $html; //設定時區 //可以在檔案開頭位置設定預設配置的時區,也可以在php.ini中進行設定 ini_set('date.timezone','Asia/Shanghai'); //date_default_timezone_set('asia/shanghai'); //向檔案中寫入內容 /* 1、開啟檔案 2、寫入資料 3、關閉檔案 */ //$file=fopen('./test.txt','a+');//追加模式 //$file=fopen('./test.txt','r+');//半覆蓋(資料多少覆蓋多少) $file=fopen('./test.txt','w+');//全覆蓋 if($file){ fwrite($file,'寫資料123!\r\n換行了嗎?\r\n');//單引號不會換行 fwrite($file,"寫資料123!\r\n換行了嗎?\r\n");//雙引號換行 echo date("Y-m-d H:i:s").'寫入資料成功'.date("Ymd His"); fclose($file); } ?>
時間格式和時區
time.php
<?php //設定時區 echo '<br/>預設時區時間:'.date("Y-m-d H:i:s").'<br/>'; //可以在檔案開頭位置設定預設配置的時區 //也可以在php.ini中進行設定date.timezone(所有檔案生效) ini_set('date.timezone','Asia/Shanghai'); echo '<br/>上海時區時間:'.date("Y-m-d H:i:s").'<br/>'; //或者直接設定時間格式 date_default_timezone_set('asia/tokyo'); echo '<br/>東京時區時間:'.date("Y-m-d H:i:s").'<br/>'; echo '<br/>格式化時間:'.date("YmdHis").'<br/>'; /* 預設時區時間:2018-09-15 10:44:03 上海時區時間:2018-09-15 16:44:03 東京時區時間:2018-09-15 17:44:03 格式化時間:20180915174403 */ ?>
建立圖形
image.php
<?php //建立畫布 $img=imagecreate(500,500); //設定顏色 //背景色 $white=imagecolorallocate($img,255,255,255); //畫筆 $black=imagecolorallocate($img,0,0,0); //矩形 imagerectangle($img,100,100,300,300,$black); //輸出影象前清理輸出緩衝 ob_clean(); //解決chrome相容性問題 header("Content-type:image/jpeg"); //輸出影象到瀏覽器 imagejpeg($img) or die("建立影象失敗<br/>"); //釋放資源 imagedestroy($img); ?>
從遠端獲取圖形
imageUrl.php
<?php $img=imagecreatefromjpeg('https://b-ssl.duitang.com/uploads/item/201607/04/20160704052649_WLyfB.jpeg'); ob_clean(); header('Content-type:image/jpeg'); imagejpeg($img) or die('建立圖形失敗'); imagedestroy($img); ?>
生成二維碼
vcode.php
<?php vcode(150,100); //生成驗證碼 function vcode($width,$high){ //建立畫布 $img=imagecreate($width,$high); //設定背景色 黑色 $black=imagecolorallocate($img,0,0,0); //設定畫筆 白色 $white=imagecolorallocate($img,255,255,255); //產生隨機干擾線條 for($i=0;$i<$width/20;$i++){ imageline($img,rand(0,$width),rand(0,$high),rand(0,$width),rand(0,$high),$white); } //產生隨機干擾點 for($i=0;$i<$width;$i++){ imagesetpixel($img,rand(0,$width),rand(0,$high),$white); } //產生4個隨機字母,數字 $data=''; for($i=0;$i<4;$i++){ switch(rand(1,3)){ case '1':$ch=rand(0,9);break; case '2':$ch=sprintf('%c',rand(65,90));break; case '3':$ch=sprintf('%c',rand(97,122));break; } $data=$data.$ch; } //繪製truetype文字 imagettftext($img,$high/3,rand(1,15),$width*0.1,$high*0.7,$white,'C:/Windows/Fonts/Arial.ttf',$data); //清理快取 ob_clean(); //解決chrome相容性問題 header('Content-type:image/jpeg'); //輸出到瀏覽器 imagejpeg($img) or die('建立畫布失敗'); imagedestroy($img); } ?>
php與資料庫mysql的連線
mysql.php
<?php //連線資料庫 $host='localhost'; $username='root'; $password=''; $database='my_db'; $conn=mysqli_connect($host,$username,$password,$database) or die('資料庫連線失敗!'); //echo '資料庫連線成功!'; //操作資料庫 $sql='select * from cartoon'; $result=mysqli_query($conn,$sql); //讀取返回資訊 while($obj=mysqli_fetch_assoc($result)){ echo $obj['name'].'現在'.$obj['age'].'歲了。<br/>'; } //關閉資料庫連線 mysqli_close($conn); ?>
MySQL資料庫面向物件程式設計
mysql_obj.php
<?php // 建立連線 $conn = new mysqli('localhost', 'root', '','my_db')or die("連線失敗: " . $conn->connect_error); if($conn){ echo "資料庫連線<br/>"; } //操作資料庫 $sql = "SELECT * FROM cartoon;"; $result=$conn->query($sql); while($row=$result->fetch_assoc()){ echo "name:".$row['name']."-country:".$row['country']."<br/>"; } /* name:校長-country:中國 name:西門慶-country:中國 name:武大郎-country:中國 name:武松-country:中國 */ //關閉連線 //$conn->close(); //$conn2=new mysqli('localhost','root','','my_db') or die('連線失敗:'.$conn2->connect_error); $sql2="SELECT * FROM cartoon;";//sql語句一定要用雙引號!!! $result2=$conn->query($sql2); //print_r($conn2->query($sql2)); while($row2=$result2->fetch_assoc()){ echo 'name:'.$row2['name'].',sex:'.$row2['sex'].'<br/>'; } $conn->close(); echo "資料庫關閉<br/>"; ?>
cookie技術
cookie.php
cookie可以用於頁面之間傳值,沒有設定有效時間,那麼預設為瀏覽器關閉失效
這就是會話cookie,儲存在記憶體中(關閉頁面不會失效,關閉瀏覽器才會失效)
cookie.php
<?php //訪問時間 echo '訪問時間<br/>'; if(isset($_COOKIE['visittime'])){ echo '您上一次訪問本網站是在:'.$_COOKIE['visittime'].'<br/>'; echo '本次訪問時間是:'.date('Y-m-d H:i:s').'<br/>'; setcookie('visittime',date('Y-m-d H:i:s')); }else{ setcookie('visittime',date('Y-m-d H:i:s')); echo '這是您第一次訪問本網站<br/>'; } //訪問次數 echo '訪問次數<br/>'; if(isset($_COOKIE['num'])){ setcookie('num',$_COOKIE['num']+1); echo '這是您第'.$_COOKIE['num'].'次訪問本網站<br/>'; }else{ setcookie('num',1+1); echo '歡迎您首次訪問本網站<br/>'; } /* 訪問時間 您上一次訪問本網站是在:2018-09-16 05:09:22 本次訪問時間是:2018-09-16 05:09:32 訪問次數 這是您第2次訪問本網站 */ //刪除cookie,有效時候為過去時間即可,time()-1 setcookie('num',1,time()-1); echo '$_COOKIE[num]已被登出<br/>'; print_r($_COOKIE);//再一次重新整理頁面時才會生效!!! ?>
檢視cookie
testcookie.php
<?php //建立cookie $sta=setcookie('testcookiename','testvalue',time()+60*60); if($sta){ echo 'Cookie設定成功!'; } ?>
chrome瀏覽器檢視cookie
開啟瀏覽器的設定》高階設定》
隱私設定/內容設定》所有cookie和網站資料
》找到你的網站名,以及cookie的名字,點選開啟即可看到儲存到cookie的內容。
session技術
session儲存在伺服器,更安全,沒有長度限制而cookie儲存在客戶機,客戶可以禁用cookiesession可以用於跨頁面請求,有一個隨機生成的唯一的session_id典型的應用就是購物車
session.php
<?php /* session技術 session儲存在伺服器,更安全,沒有長度限制 而cookie儲存在客戶機,客戶可以禁用cookie session可以用於跨頁面請求,有一個隨機生成的唯一的session_id 典型的應用就是購物車 */ //準備工作,設定php.ini的session.save_path="C:\xampp\tmp" //啟動會話 session_start(); //設定session $_SESSION['name']='Peter'; $_SESSION['password']='12345'; echo 'Session 建立成功!<br/>'; /*開啟伺服器的session檔案檢視 name|s:5:"Peter";password|s:5:"12345"; */ print_r($_SESSION); //清空session,session檔案只是清空 $_SESSION=array(); echo '<br/>登出當前回話session<br/>'; print_r($_SESSION); //銷燬session檔案,session檔案會被刪掉 session_destroy(); echo '<br/>session已經徹底銷燬<br/>'; print_r($_SESSION); ?>
檢視session
如果銷燬了session
檔案上傳
file_upload.php
<html> <form method='post' enctype='multipart/form-data'> <input type='file' name='upfile' /> <input type='submit' value='上傳' /> </form> </html> <?php if(!empty($_FILES)){ print_r($_FILES); $tmpname=$_FILES['upfile']['tmp_name'];//檔案臨時名 $name=$_FILES['upfile']['name'];//檔案原名 //檔案會上傳到與該頁面檔案同一個目錄 move_uploaded_file($tmpname,$name) or die('檔案上傳失敗,程式退出!'); echo '<br/>檔案上傳成功!<br/>'; }else{ echo '<br/>沒有上傳檔案<br/>'; } ?>
ok,基本上php的內容學到這裡,就可以了。