原創內容,轉載請注明。
主要內容:
- 搭建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存儲在客戶機,客戶可以禁用cookie
session可以用於跨頁面請求,有一個隨機生成的唯一的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的內容學到這里,就可以了。
