37 整型細節說明
$a;
echo $a;
var_dump($a) //NULL
一個數總是要占用內存空間(字節),在php中一個整數一般占用四個字節(與平台相關),一個字節占用8bit
php的整數的二進制的最高位表示符號 0 表示正數 1 表示負數
通過PHP_INT_SIZE可以顯示我們自己的電腦上一個整數用幾個字節表示
echo PHP_INT_SIZE; //4 我的電腦中一個整數是4個字節 32bit
echo PHP_INT_MAX; //整型最大的數為2147483647 最大負數為-2147483647
//2147483647 = 2^31 - 1 二進制表示01111111 11111111 11111111 11111111
如果給定一個數超出了int范圍,將會解釋為float
38 布爾數細節 浮點數細節 字符串字節
布爾數細節
以下值被當做false:
- 布爾值false
- 整型值0
- 浮點值0.0
- 空字符串以及字符串“0”
- 不包括任何元素的數組
- 不包括任何成員的對象
- 特殊類型NULL(包括未設定的變量)
浮點數細節
浮點數的字長和平台相關,通常最大值是1.8e308並具有14位十進制數字的精度
浮點數精度是14位(從左邊開始第一個非零的數就是精度的第一位)
$a = 0.1234567890222298;
echo $a; //0.12345678902223
字符串細節
$a = "hello" //$a 占用5個字節
""中的變量將被解析,‘’中的變量直接輸出其字符本身
39 算術運算符 比較運算符 邏輯運算符
$a=10;$b=7;
if($a++>10 && $b++>7){ //注意后++和前++的運算順序
echo 'ok' //不輸出
}
echo $a; //11
echo $b; //7
$f = false or true;
echo $f; //false or的優先級比=還低
and && 都表示邏輯與 區別在於&&的優先級比and高
or || 都表示邏輯或 區別在於||的優先級比or高
44 布置練習
$_REQUEST()
接受的參數要和提交數據的頁面給出的html元素名字一致,否則接受的數據是null或""
45 break continue 常量
break/continue語句可以接受一個可選的數字參數來決定跳出幾重循環
geto語句常用來跳出循環或switch,可替代多層break
47 函數使用
include與require區別:
- 當include包含的文件出錯時,提出警告,程序繼續往下執行
- 當require包含的文件出錯時,致命性錯誤,終止程序
include_once與require_once 當需包含的文件已經包含時,則不執行
項目中經常使用require_once,放在頁面頭部
48 函數調用深入理解
含糊調用時會開辟一個新棧,各棧中變量是相互獨立的,參數是以值形式傳遞
函數名不區分大小寫
在PHP中錯誤有3種形式:
- Notice:注意
- Warning:警告
- Error:錯誤
51 位運算
- 二進制的最高位是符號位:0 表示正數,1表示負數
- 原碼:用二進制來表示的代碼
正數的原碼 反碼 補碼 都一樣
負數的反碼:原碼符號位不變,其他位取反(0->1 1->0)
負數的的補碼:反碼+1 - 0的反碼補碼都是0
- php無符號數
- 在計算機運算的時候都是以補碼來運算的
- 按位與&: 兩個全為1,結果為1
- 按位或|: 兩個中有一個為1,結果為1
- 按位異或^:兩個一個為0,一個為1,結果為1
- 按位取反~:0=>1 1->0
- 算術左移<<:符號位不變,低位補0 (左移1位相當於乘以1個2)
- 算術右移>>: 低位溢出,符號位不變,並用符號位補溢出的高位
55 數組使用細節
unset()可以刪除數組中的某個值,該索引不會重新自動建立。也可銷毀某個變量,
$a + $b 數組的聯合操作
$a = array( "a" => "apple" , "b" => "banana" );
$b = array( "a" => "pear" , "b" => "strawberry" , "c" => "cherry" );
$c = $a + $b ; // Union of $a and $b
echo "Union of \$a and \$b: \n" ;
var_dump ( $c );
//array( "a" => "apple" , "b" => "banana" ,"c" => "cherry")
$c = $b + $a ; // Union of $b and $a
echo "Union of \$b and \$a: \n" ;
var_dump ( $c );
//array( "a" => "pear" , "b" => "strawberry" , "c" => "cherry" )
提交給當前頁面時,阻止Notice報錯的方法:
- 將php.ini文件中的error_reporting改為:
error_reporting = E_ALL & ~E_NOTICE
- 在當前頁面添加
error_reporting(E_ALL ^E_NOTICE);
- 添加一個隱藏的input
<input type="hidden" name="action" value="submitted">
在php文件中if(isset($_POST['action']) && $_POST['action'] == "submitted"){}
56 排序方法
常用排序方法:
- 內部排序法
- 交換式排序法
- 冒泡排序法
基本思想:每走一次外層循環就排好一個數,里層循環的循環次數也就少了一個 - 快速排序法
- 冒泡排序法
- 選擇式排序法
- 選擇排序法
基本思想:第一次外層循環選出數組中最小的數與原數組第一個數交換,第二次循環從剩余的數(不包括第一項)中選出最小的數與原數組第二個數交換…… - 堆排序法
- 選擇排序法
- 插入式排序法
- 插入排序法
基本思想:把n個待排序的數分為一個有序表(含一個元素)和一個無序表(含n-1個元素),排序過程中依次從無序表中取出一個數與有序表中的元素進行排序並插入適當位置。 - 謝爾排序法
- 二叉樹排序法
- 插入排序法
- 交換式排序法
- 外部排序法
冒泡排序法
function bubbleSort(&$array){ //數組默認傳遞的是值
$temp = 0;
for($i = 0;$i < count($array) -1;$i++){
for($j = 0;$j < count($array) - 1 -$i;$j++){
if($array[$j] > $array[$j+1]){ //從小到大排列
$temp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $temp;
}
}
}
}
選擇排序法 效率比選擇排序法稍高,不是每一次都需要交換
function selectSort(&$array){
$temp = 0;
for($i = 0;$i < count($array) - 1;$i++){
$minVal = $array[$i]; //假設$i就是最小值
$minValIndex = $i;
for($j = $i+1;$j < count($array);$j++){
if($minVal > $array[$j]){ //從小到達排列
$minVal = $array[$j]; //找最小值
$minValIndex = $j;
}
}
$temp = $array[$i];
$array[$i] = $array[$minValIndex];
$array[$minValIndex] = $temp;
}
}
插入排序法
function insertSort(&$array){ //從小到大排列
//先默認$array[0],已經有序,是有序表
for($i = 1;$i < count($array);$i++){
$insertVal = $array[$i]; //$insertVal是准備插入的數
$insertIndex = $i - 1; //有序表中准備比較的數的下標
while($insertIndex >= 0 && $insertVal < $array[$insertIndex]){
$array[$insertIndex + 1] = $array[$insertIndex]; //將數組往后挪
$insertIndex--; //將下標往前挪,准備與前一個進行比較
}
if($insertIndex + 1 !== $i){
$array[$insertIndex + 1] = $insertVal;
}
}
}
快速排序法
function quickSort($array){
if(!isset($array[1]))
return $array;
$mid = $array[0]; //獲取一個用於分割的關鍵字,一般是首個元素
$leftArray = array();
$rightArray = array();
foreach($array as $v)
{
if($v > $mid)
$rightArray[] = $v; //把比$mid大的數放到一個數組里
if($v < $mid)
$leftArray[] = $v; //把比$mid小的數放到另一個數組里
}
$leftArray = quickSort($leftArray); //把比較小的數組再一次進行分割
$leftArray[] = $mid; //把分割的元素加到小的數組后面,不能忘了它哦
$rightArray = quickSort($rightArray); //把比較大的數組再一次進行分割
return array_merge($leftArray,$rightArray); //組合兩個結果
}
58 順序查找 二分法查找
順序查找
function search(&$array,$findVal){
$flag = false;
for($i = 0;$i < count($array);$i++){
if($findVal == $array[$i]){
echo "find it,it's index is $i";
$flag = true;
break; //找到第一個就停止
}
}
if(!$flag){
echo 'can not find it!'
}
}
二分法查找
二分法查找的前提是數組已排序好
首先找到數組的中間數,與要找的數進行比較,如果要找的數大於中間數,則向后找,如果要找的數小於中間數,則向前找,如果相等則已找到。
function binarySearch(&$array,$findVal,$leftIndex,$rightIndex){
if($leftIndex > $rightIndex){
echo "找不到!";
}
$middleIndex = round(($leftIndex + $rightIndex)/2);//找到中間數下標
if($findVal > $array[$middleIndex]){ //如果要找的數大於中間數,則向后找
binarySearch($array,$findVal,$middleIndex + 1,$rightIndex);
}else if($findVal < $array[$middleIndex]){ //如果要找的數小於中間數,則向前找
binarySearch($array,$findVal,$leftIndex,$middleIndex - 1);
}else{ //如果相等則已找到
echo "find it,it's index is $middleIndex";
}
}
64 函數傳遞即本數據類型和數組的方式
函數在傳遞基本數據類型(整型 浮點型 字符串 布爾型)是以值傳遞的,加上&符號之后是以引用傳遞
在傳遞數組時,默認也是按值傳遞
67 構造方法
對象在創建時即使類中沒有明確定義構造方法,會使用默認的構造方法,一旦定義構造方法默認的將被覆蓋
構造方法的默認修飾符是public
構造方法中的形參個數與對象創建時的實參個數需一致
68 析構方法
析構函數的作用是釋放資源的操作,並不是銷毀對象本身
銷毀的順序是先創建的對象最后被銷毀,按棧(先入后出)順序
什么時候調用?
- 當程序(進程結束)退出的時候
- 當一個對象成為垃圾對象(沒有任何引用指向它)的時候,析構方法立即調用
69 靜態變量
定義靜態變量: [訪問修飾符] static $變量名
靜態變量的訪問:
- 如果在類中訪問 self::$變量名
- 如果在類外訪問 類名::$變量名
- 靜態變量屬於類的
class Person{
public static $a = 90;
public function __construct(){ //代碼未執行
$this -> a = 45;
}
}
echo Person::$a; //90
70 靜態方法
靜態方法也叫類方法,是屬於所有對象的實例
[訪問修飾符] static 方法名(){}
常用靜態方法操作靜態變量,而不能操作非靜態變量
在類外部: 類名::類方法名 或者 對象名->類方法名
在類內部: self::類方法名 或者 類名::類方法名
71 面向對象特性
成員屬性前必須指定訪問修飾符
成員方法前默認訪問修飾符為public
protected和public所修飾的成員屬性和成員方法在被子類繼承時,修飾符不變
子類實例化時默認不會調用父類的構造方法,若需要調用可使用父類名::方法名或者parent::方法名來使用
PHP5默認情況下不直接支持重載,但可通過魔術方法__call()來實現重載效果
在方法的覆蓋時,子類的訪問權限不能小於父類的訪問權限
75 抽象類
抽象類主要用途是讓子類來繼承,其本身並不需要實例化,這樣可以達到代碼復用。用abstract來修飾
一個類中只要含有抽象方法,則該類必須聲明為抽象方法
抽象類實質是子類的父類,它可以有抽象方法,也可以有可實例化的方法
abstract class Animal{
public $name="abc";
protected $age;
abstract public function cry();
public function getName(){
return $this->name;
}
public static function test(){
echo "可以條調用";
}
}
class Cat extends Animal{
public function cry(){
echo "miaomiao";
}
}
$cat1 = new Cat();
$cat1->cry();
echo $cat1->getName(); //abc
Animal::test(); //可以條調用
76 接口
接口的作用主要是制定規范(定義方法或屬性,供類來實現它)。
interface 接口名1{
const A=90; //可以定義常量
public function start();
}
interface 接口名2{
public function stop();
}
class 類名 implements 接口名1,接口名2{ //可實現多個接口
public fucntion start(){
//your code
}
public fucntion stop(){
//your code
}
}
echo 接口名1::A; //90
- 接口名一般以i開頭
- 接口不能實例化,只能由類來實現
- 接口里的所有方法都沒有方法體,只有當某個類去實現它的時候才把寫出方法體
- 一個類可以實現多個接口,需用逗號隔開
- 接口中可以有屬性,但必須是常量,並且是public
- 接口中的方法必須是public,默認是public
- 接口不能繼承類,但是接口可以繼承多個其他接口
- 實現接口是對單一繼承的補充
interface iUsb1{ public function a(); } interface iUsb2{ public function b(); } interface iUsb extends iUsb1,iUsb2{ public function c(); } class usb implements iUsb{ //必須全部實現所有接口定義的方法 public function a(){} public function b(){} public function c(){} }
77 final const
如果我們希望某個類不被其他類繼承時,可以使用final修飾符
如果我們希望某個方法不能被子類改寫,可以使用final修飾符
final不能修飾成員屬性
類中常量const
基本用法 const 常量名=值
訪問: 類名::常量名 或 接口名::常量名
常量名應全部大寫,並且前面不能有$符,常量在定義是必須賦值,常量是屬於類的
81 錯誤處理
set_error_handle();設置自定義錯誤處理函數
trigger_error();錯誤觸發器
error_log();向指定的文件發送個錯誤記錄
82 異常處理
當捕獲到一個異常后,try塊中的后續代碼不被繼續執行
84 http請求
get/post的區別
- 安全性
get請求的數據會顯示在地址欄,post請求的數據放在http協議的請求體 - 數據大小
http協議本身並不限制請求數據大小,瀏覽器會限制url的長度 - get請求攜帶參數可以更好的添加到收藏夾
禁止瀏覽器緩存設置
header("Expires:-1");
header("Cache-Control:no-cache");
header("Pragma:no-cache");
87 文件下載
/*
* $file_name 文件名
* $file_sub_dir 下載文件的子路徑
*/
function fileDown($file_name,$file_sub_dir){
//對文件名中的中文進行轉碼
$file_name = iconv("utf-8","gb2312",$file_name);
//文件絕對路徑
$file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
if(!file_exists($file_path)){
echo "文件不存在!";
return ;
}
//文件指針
$fp = fopen($file_path, "r");
//文件大小
$file_size = filesize($file_path);
//返回的文件類型
header("Content-type: application/octet-stream");
//按照字節返回
header("Accept-Ranges: bytes");
header("Accept-Length: $file_size");
//瀏覽器彈出對話框 對應文件名
header("Content-Disposition: attachment;filename=".$file_name);
$buffer = 1024;
while(!feof($fp)){
$file_data = fread($fp,$buffer);
echo $file_data;
}
fclose($fp);
}
fileDown("截圖.jpg","study/php/exercise/")
101 $_POST
在復選框表單提交時需注意:
<form action="test.php" method="post">
<input type="checkbox" name="hobby[]" value="book"> //復選框的name值需寫為數組格式
<input type="checkbox" name="hobby[]" value="write">
</form>
114 cookie
創建cookie
bool setCookie ( string $name [, string $value [, int $expire = 0 [,string $path [,string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
setCookie('name','jesse',time()+3600);
獲取cookie
$name = $_COOKIE['name'];
超過有效期則獲取不到,cookie自動銷毀,不同的鍵值對可以指定不同的有效時間
刪除cookie
要刪除某個鍵值對時,只需把過期時間改成比當前時間還小即可
setCookie('name','jesse',time()-1)
要刪除全部cookie 遍歷刪除
foreach($_COOKIE as $key=>$value){
setCookie($key,"",time()-1);
}
118 session
session可以存儲的數據類型有string boolean integer double array object
要使用session都必須初始化
//1.初始化session
session_start();
//2.保存數據
$_SESSION['name']="jesse";
//3.獲取所有session數據
print_r($_SESSION);
//通過key獲取指定的值
$_SESSION['name'];
//如果我們需要取出對象,則需要實現申明該對象的類的信息w