PHP
(personal homepage)是HTML內嵌式語言,是一種在服務器端執行的嵌入HTML文檔的腳本語言。由zend公司維護。
為什麼要安裝web服務器?因為我們浏覽器要取數據,從web服務器湖獲取。httpwatch工具可以獲取發送和接受的數據,有利於我們了解的更透徹。服務器除Appche還有微軟iis服務器、lighttpd服務器(讀ligty)等.
Appche服務器
Appche服務器跨所有平台。可以通過ssh軟件遠程控制服務器。這時候要使用命令行。管理appche可以使用命令行。cd:切換目錄。appache啟動以後,會占用一個端口,默認80端口監聽。一台機器可以有1-65535號端口,在開發中,可以使用netstat -an來查看有哪些端口在監聽。端口越少越安全。如果發現有異常端口監聽,則可以關閉該端口。用netstat -anb發現是哪個程序在監聽,從而關閉。一個端口只能被一個程序監聽。自己電腦發送請求時也有端口,是隨機分配的,包含在URL中,用完就釋放了。
appche目錄結構
bin目錄用於存放常用命令
cgi-bin該目錄存放Linux下常用命令
conf目錄用來存放配置文件
error目錄存放啟動和關閉時的錯誤記錄
htdocs目錄用於存放站點文件(html)多個站點可以通過文件夾分類。
icons目錄存放圖標
logs目錄記錄appche相關日志
manual目錄手冊
modules目錄appche模塊appche以模塊形式管理
虛擬主機的配置步驟
1.在httpd-conf中啟用httpd-vhosts.conf文件
2.在httpd-vhosts.conf文件中做配置
3.修改hosts文件(重新審視訪問一個網頁的真正流程)
詳細說明訪問網頁的流程
浏覽器回車後發生的事
1.解析主機名
2.查詢本地文件hosts(windows下),該文件裡有一個IP地址,查詢和域名的關系,查詢不到,轉到外網dns域名服務器查詢IP和域名的關系,查到了會向appche發送http請求,appche拿到請求後要解析主機,解析web站點名稱解析資源名稱,取出一個資源文件,如果取到了,則返回該頁面。
一個IP(多個端口)和多個域名綁定
方案一:通過端口來區分不同的站點
1.先開發好自己的網站
2.配置我們的httpd.conf文件 啟用裡面的virual hosts文件,即啟動虛擬主機的配置
3.配置httpd-hosts.conf文件。
4 在hosts文件中添加IP和域名的對應關系
添加一個新的域名與該IP綁定
1.開發新的網站
2.添加新的虛擬主機
3在httpd.conf中讓appche監聽81端口,appche可以同時監聽多個端口
4在hosts文件中添加新的域名
方案二:通過servername端區分不同的域名
1.開發新網站
2.在httpd-vhosts.conf文件中添加配置文件,和方案一配置有所區別,要指定域名ServerName www.sth.com。
3.在hosts文件中添加IP和域名的對應關系,和方案一相同。
網站資源文件(包括PHP文件)和appche在同一台機器,叫應用服務器,浏覽器在另一台機器。數據庫一般不在應用服務器,在專門數據庫服務器上。
appche和PHP需要整合,PHP調用過程如下
浏覽器回車,解析主機名例如sohu,查詢和主機名對應的IP,查不到就到外網dns查詢,查到了,拿到IP後向appche發送http請求,appche解析主機(appche管理多個域名),取出站點/目錄,解析出資源名(網站的具體哪一頁),將請求文件返回,PHP代碼在appche已經執行完了,浏覽器拿到的是服務器執行完後的代碼,再解析後顯示出來。
PHP代碼修改了不需要重啟appche。
PHP基本語法
<?php ?>和HTML可以相互嵌套。
注釋:/**/多行,//單行 ,#Unix風格。
PHP基本語法、變量,常量,數據類型
1 php中定義一個變量要以$符號開頭,變量的數據類型不是固定的,是根據運行時上下文確定的。所以PHP是弱數據類型編程語言。
2.PHP區分大小寫。
一個有效的變量由字母或下劃線開頭
基本數據類型:整型,浮點型,布爾型,字符串型
復合數據類型:數組,對象
特殊數據類型:null 資源類型
PHP中,一個整數一般占四個字節,一個字節占8bit,最高位表示符號位,0表示正數,1表示負數PHP_INT_SIZE
一個整數最大是多少?用PHP_INT_MAX可查看,負整數和正整數最大值(絕對值)一樣。如果整數范圍超出最大范圍,則自動類型變為float類型。
浮點數:精度最大14位,從左邊開始計算,第一個非0的數開始計算精度
字符型:一個字符占用一個字節,理論上沒有大小限制,只要不超過內存就可以
比較符==等於,===全等
邏輯異或Xor:兩個有一個為true,但不同時為true ,為true
三元運算符
表達式1?表達式2:表達式3
字符串運算符
.:連接兩個字符串(基本數據類型)
類型運算符
instanceof用於確定一個變量是否屬於某一類型(只能判斷對象類型)
三大流程控制語句
1.順序控制
2.循環控制
3.條件控制
switch(表達式){
case 常量1:語句;
break;
case 常量2:語句;
break;
case 常量3:語句;
break;
case 常量n:語句;
break;
defual:語句;//可以沒有
break;
}
break語句:結束當前的循環或switch語句,可以給一個數字表示退出到第幾層。break 3;
break代表不玩游戲了,continue表示重新從第一關開始玩。
continue也可以帶一個數字,表示從第幾層開始走
常量:前面不需要$符號。用define()函數定義,而不能通過賦值語句;常量的值是標量[基本數據類型](string,integer,float,boolean),一旦定義,不能修改其值。,不希望某個值變化時使用常量,比如圓周率,稅率。
常量的名稱全部大寫,用下劃線間隔
定義常量兩種方法:
define("TAX_RATE",0.08);
const TAX_RATE2=0.1;
函數:調用:require 'funcs.php';
function 函數名(參數列表){
//函數體;
//return 語句,返回一個結果,可以沒有。
}
PHP中頁面相互調用
為了完成a.php中可以使用到function01.php中定義的函數,我們需要使用以下函數:
require()和require_once()函數。
include()和include_once()函數。
<?php
require('要引入的文件名');
$filePath="a.php";//通過變量引入
require $filePath;
require '要引入的文件名';
?>
執行一個函數時,會從一個新棧執行函數裡的代碼,然後返回到函數調用處,然後繼續執行下面的代碼。
require_once的優點:
前者遇到即包含文件,後者會判斷是否已經包含了該文件,如果包含過來則不再包含。一可以節省資源,二可以避免重復定義的錯誤。
include和include_once
都可以把一個頁面包含到另一個頁面,用法同上
require和include區別
include遇到錯誤會繼續執行,require會終止執行
推薦使用require_once,通常放在php頁面最前面
如何理解函數的調用過程
按照函數執行的規則,只要一看到函數立刻開辟新棧,各個棧之間的變量是相互獨立的(空間相互獨立)。
函數參數和變量作用域:
1.函數的參數列表可以有多個參數
2.參數列表數據類型可以是多個類型,PHP支持的任意類型
3.函數的命名跟自定義變量一樣,但是不區分大小寫
4.一個自定義函數中定義的變量是局部的,函數外不生效
5.使用global全局變量的時候,可使用在函數外的變量
$a=12;
function abc3(){
global $a;//要在abc3()中使用外層$a
$a+=45;
}
abc3();
echo $a;
6.為了防止全局變量的混亂,可以使用unset($var)刪除一個變量
例:$a=12;
function abc($a){
unset($a);//表示不再abc函數范圍內,不使用$a,後面重新定義。
$a=45;
}
abc($a);
echo $a;
7.函數的默認值問題
可以給某些參數賦一個默認值
function abc($b,$a=2){
$res=$a+$b;
return $res;
}
$e=70;
echo abc($e).'||';//72,$a默認為2
acho abc($e,90);//160
$f=80;
echo abc($e,$f);
8.PHP默認是值傳遞,如果需要地址傳遞,
function abc(&$b){//加地址符
$b=314;
}
abc($a);//$a的地址指向$b的地址
echo $a;//314位運算
二進制:逢二進一,使用二進制只有0和1兩個數,易於電子方式實現,同時,通過0和1的組合,可以表示任何一個數。
1.二進制的最高位是符號位,0表示正數,1表示負數
2.正數的原碼、反碼和補碼都一樣
用二進制表示一個數,這個碼就是源碼
1.......>原碼 00000000 00000000 00000000 00000001
負數的反碼:原碼符號位不變,其他為取反
-1......>原碼 10000000 00000000 00000000 00000001
-1......>反碼 11111111 11111111 11111111 11111110
負數的補碼:它的反碼加1
-1......>補碼 11111111 11111111 11111111 11111111
0的反碼、補碼都是0
PHP沒有無符號數,只要是數,最高位就是符號
在計算機運算的時候,都是以補碼的方式來計算的
不管是正數還是負數,都要被轉化成補碼,然後進行計算
位運算符
$a & $b And(按位與) 將把$a和$b中都為1的位設為1.
$a | $b Or(按位或) 將把$a或者$b中為1的位設為1.
$a ^ $b Xor (按位異或) 將把$a和$b中不同的位設為1.
~$a Nor (按位取反) 將把$a中為0的位設為1,反之亦然.
$a << $b shift left 將把$a中的位向左移動$b次(每次移動都表示乘以2).
$a >> $b shift right 將把$a中的位向右移動$b次(每次移動都表示除以2).
前面四個叫位運算,後面兩個是移位運算
~2=?
1.求出2的補碼 00000000 00000000 00000010
2.取反 11111111 11111111 11111101(補碼)-》原碼
11111111 11111111 11111100 //補碼減一得到反碼
10000000 00000000 00000011 //-3
所以, ~2=-3
位移運算規則
算術右移:低位溢出,符號位不變,並用符號位補溢出的高位
算術左移:符號位不變,低位補0
$a=1>>2;
1.找到1的補碼:00000000 00000000 000000000 00000001
00000000 00000000 000000000 00000000
$a=0;
$b=-1>>2;
1.找到-1的補碼:10000000 00000000 00000000 00000001
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111
2.算術右移兩位 11111111 11111111 11111111 11111111
結果補碼--原碼 、
1111111 11111111 11111111 11111110(減一變反碼)
10000000 00000000 000000000 00000001(原碼)//-1
-1>>2=-1;
$c=1<<2;
1的補碼:00000000 00000000 00000000 00000001
左移兩位 00000000 00000000 00000000 00000100 //4
數組、排序、查找
為了知道數組中總共有多少個元素,可以使用系統函數count:count(數組名);
數組創建
數組是關鍵字和值的集合
.創建數組一
1.$arr[0]=123;
$arr[1]=90;
$arr[2]=8;
數組在內存中的存在方式:每個數組元素分配一個空間,$arr相當於樓層,每個元素代表一個房間
在PHP數組中,每個元素值的數據類型不限制
.創建數組二
$數組名=array(值1,值2,值3...);
下標又叫關鍵字,可以是數字,也可以自己指定(默認情況下,我們的元素的下標是從0開始給你編號)
$arr['logo']="beijing";
#arr['php']=123;
或者
$arr=array<"logo"=>"北京","php"=>123>
如果我們創建一個數組時,沒有給某個元素指定下標,PHP就會自動用目前最大的那個下標值,加上1作為該元素的下標(關鍵字)
我們通常可以使用print_r來顯示這個數組情況
var_dump($arr)可以更加詳細的顯示數組的信息
一維數組使用陷阱
$arr[bar]='hello world';這樣使用危險,不要這樣用
PHP數組相關函數
count函數:由於統計數組元素有多少個 count(數組名)。
is_array函數
print_r()和var_dump()函數。
explode函數:拆分字符串$arr=explode(" ",$str);//用空格拆分字符串$str.