1. 程式人生 > >【原】PHP從入門到精通2小時【圖文並茂】

【原】PHP從入門到精通2小時【圖文並茂】

原創內容,轉載請註明。

主要內容:

  1. 搭建PHP開發環境
  2. 第一個helloworld程式
  3. 變數
  4. 全域性變數
  5. 迴圈結構
  6. 函式
  7. 陣列
  8. 面向物件程式設計
  9. 繼承
  10. 介面
  11. 多型
  12. 日誌
  13. 檔案的讀寫
  14. 時間格式和時區
  15. 建立圖形
  16. 從遠端獲取圖形
  17. 生成二維碼
  18. php與資料庫mysql的連線
  19. mysql資料庫面向物件程式設計
  20. cookie技術
  21. 檢視cookie
  22. session技術
  23. 檢視session
  24. 檔案上傳

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句話:

  1. 類用來封裝程式碼
  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個核心概念:

  1. 封裝
  2. 繼承
  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的內容學到這裡,就可以了。