後端逆襲,一份不可多得的PHP學習指南

前言

我想問本身,爲何要學習PHP,什麼是PHP,學習以後,我能作什麼,將來的發展,那麼如何學習一門編程語言,如何給出學習建議。javascript

php是一種超文本預處理器的學習語言,它是一種被普遍應用的開放源代碼的多用途的腳本語言,它可嵌入到HTML中,尤爲是適合web開發。php

PHP是一種在服務器端執行的嵌入HTML文檔的腳本語言。語言的風格相似於C語言,如今被不少的網站編程人員普遍的運用。使用PHP能夠開發各類交互式的動態網頁。css

那麼如何理解動態網頁呢?接下來講一說:html

動態網站和靜態網站的區別?
  1. 動態網站:能夠和數據庫交互的網站
  2. 靜態網站:不能和數據庫交互

還有如LAMP這些詞表明什麼意思呢?在PHP中經常使用到的:前端

LAMP是什麼呢,須要瞭解一下?
  1. L:LINUX
  2. A:Apache
  3. M:mysql
  4. P:PHP

擴展性說說以下詞彙,須要咱們逐步去了解。java

PHP環境搭建(LAMP,LNMP,LNMPA)

LAMP: Linux+Apache+MySQL+PHPmysql

LNMP: Linux+Nginx+MySQL+PHPjquery

LNMPA: Linux+Nginx+MySQL+PHP+Apachegit

WAMP: Window+Apache+MySQL+PHPgithub

集成環境: wampserver, xampp, phpstudy

apache,web服務器

Apache是世界上使用排名前列的web服務器軟件,它能夠運行在幾乎全部普遍使用的計算機平臺上,因爲其跨平臺和安全性被普遍使用,是最流行的web服務器端軟件之一。它快速,可靠而且可經過簡單的api擴充。

那麼讓咱們走進PHP世界,瞭解其語法結構吧!

基礎語法

PHP文檔結構:1.文檔擴展名.php; 2.注意,文件名不要使用中文,也不要包含特殊字符

PHP標記風格:

  • 標準風格

下面看看代碼示例:

<?php 代碼段;?>
  • 短風格

下面看看代碼示例:

<?代碼段;?>
注意:須要配置 PHP配置文件 php.inishort_open_tag=On,重啓 Apache服務器便可
  • ASP風格:

下面看看代碼示例:

<% 代碼段; %>
注意:須要配置 PHP配置文件 php.iniasp_tags=On,重啓 Apache服務器便可

PHP語法風格示例:

<?php
echo 'this is dada show dada';

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>55555--<?php echo 'hello world';?></title>
    <style media="screen">
      h1{
        color:<?php echo '5555';?>;
      }
    </style>
    <script type="text/javascript">
      alert('hello world');
    </script>
  </head>
  <body>
    <h1>this is dadada show time<?php echo 'dada';?></h1>
  </body>
</html>

<?php
// 標準風格的寫法
// echo 輸出一個或者多個字符串
/*
echo 'this is a dada';

echo '<br/>';

echo 'hello world';
*/

echo 'this is dada show time';

學習php須要工具,這裏能夠說說常使用的phpstorm

講講phpstorm的安裝和使用

phpstormJetBrains公司開發的一款商業的PHP集成開發工具,能夠隨時幫助用戶對其進行編碼,運行單元測試或者提供可視化debug功能。

下載

進入phpstorm官網,點擊「downLoad」按鈕,進入下載頁面。

最後,雙擊桌面圖標便可。

PHP語法結構

php文件命名注意事項:

變量的注意事項:

數據類型:

特殊符號:

單引號和雙引號的區別
  1. 雙引號解析變量,單引號不解析變量
  2. 單引號執行效率快
  3. 雙引號解析全部的轉義符,單引號只解析\\\這兩個轉義符
花括號的意義
  1. 將變量變成一個總體
  2. 第一種${變量名}變量名;
  3. 第二種{$變量名變量名};
經過函數形式實現臨時轉換
  1. intval(變量)轉成整型
  2. strval(變量)轉成字符串型
  3. boolval(變量)轉成布爾類型
永久轉換
  1. settype(變量,設置的類型)設置變量類型
  2. gettype(變量)獲得變量的類型
變量函數庫檢測變量類型
  1. is_int(變量) > 檢測整型
  2. is_string(變量) > 檢測字符串類型
  3. is_array(變量) > 檢測數組類型
  4. is_resource(變量) > 檢測資源類型
  5. is_object(變量) > 檢測對象類型
  6. is_null(變量) > 檢測null類型
  7. is_numeric(變量) > 檢測數值型

常量

  • 問:什麼是常量?
  • 答:常量和變量相反,在腳本執行期間該量不能被修改
系統常量
  1. PHP_VERSION:獲得php版本
  2. PHP_OS:獲得服務器的操做系統
  3. M_PI:PI的值
  • 注意事項:
  1. 常量名稱前面沒有$符號
  2. 開頭用字母或者下劃線,儘可能使用大寫字母
  3. 常量定義出來,不能改變也不能取消定義
  4. 常量的值只能爲標量,能夠用資源,可是不推薦
  5. 常量默認區分大小寫
檢測常量是否被定義
  1. defined函數
  2. var_dumpdefined變量)
魔術常量
  1. __LIEN__獲得行號
  2. __FILE__獲得文件的完整路徑和文件名
  3. __FUNCTION__函數名稱
  4. __CLASS__
  5. __METHOD__方法
  6. __DIR__返回文件所在路徑

以點的形式來鏈接咱們的變量

隨機生成驗證碼

讓咱們來看看下面示例代碼:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="jquery-2.2.3.js" type="text/javascript"></script>
</head>
<body>
<?php
header("content-type:text/html;charset=utf-8");
$str = '';
$rand = mt_rand(1000, 9999);
$str.='<span style="color:rgb('.mt_rand(0, 255).',
    '.mt_rand(0, 255).','.mt_rand(0, 255).')
    ">'.mt_rand(0, 9).'<span>';
$str.='<span style="color:rgb('.mt_rand(0, 255).',
    '.mt_rand(0, 255).','.mt_rand(0, 255).')
    ">'.mt_rand(0, 9).'<span>';
$str.='<span style="color:rgb('.mt_rand(0, 255).',
    '.mt_rand(0, 255).','.mt_rand(0, 255).')
    ">'.mt_rand(0, 9).'<span>';
$str.='<span style="color:rgb('.mt_rand(0, 255).',
    '.mt_rand(0, 255).','.mt_rand(0, 255).')
    ">'.mt_rand(0, 9).'<span>';
?>
<label for="check">請輸入驗證碼:</label>
<div id="hiddent_val" style="display: none;"><?php echo $str ?></div>
<input type="text" name="check" id="check_val"/><?php echo $str; ?>
<br/>
<input type="button" onclick="javascript:check();" value="提交"/>

<script>
 function check(){
   var v1=$("#hiddent_val").text();
   v1 = v1*1;
   var v2=$("#check_val").val();
   v2 = v2*1;
   if(v1==v2){
       alert('true');
   }else{
    alert('false');
   }
 }
</script>
</body>
</html>

日期函數

日期函數格式代碼:

data($format[,$time=time()])
time():
Y:年,m:月, d:日, h:小時, i:分鐘, s:秒

w:星期一到星期天 0表示星期天
設置時區:函數形式
date_default_timezone_get()

date_default_timezone_set($timezone);

預約義變量

預約義變量:系統內已定義的變量,以下有:

  1. $_POST:http-post變量,接收表單以post方式發送的數據
  2. $_GET:HTTP-get變量,接收以?形式傳參的數據
  3. $_FILES:HTTP文件上傳變量
  4. $_SERVER:服務器和執行環境變量
  5. $_ENV:環境變量
  6. $_SESSION:會話變量
  7. $_COOKIE:HTTP Cookies
  8. $_REQUEST:$_GET+$_POST+$COOKIE
  9. $php_errormsg前一個錯誤信息
  10. $GLOBALS超全局變量,在所有做用域中始終可用的內置變量

Switch...case

讓咱們看看Switch...case的示例代碼以下:

<?php
$a = 2;
switch ($a){
    case 1:
        echo 'a<br/>';
        break;
    case 2:
        echo 'b<br/>';
        break;
    case 3:
        echo 'c<br/>';
        break;
        default:
        echo '默認的執行';
}

for示例

讓咱們看看for的示例代碼以下:

<?php
//1到100的數進行相加   5050,
//1+2+3+4
$sum =0;
for($i=0;$i<101;$i++){
    $sum = $sum+$i;
}
echo $sum;
echo '<hr/>';
//1到100可以被2整除的數,
for($i=1;$i<101;$i++){
    if($i%2==0){
        echo '這是可以被2整除的數:'.$i.'<br/>';
    }
}

學習小案例以下-乘法表代碼:

<?php

/* 1*1=1;
 * 1*2=2 2*2=4
 * */
for($i=1;$i<=9;$i++){
    for($j=1;$j<=$i;$j++){
        echo $j.'*'.$i.'='.($i*$j)."\t";
    }
    echo '<br/>';
}

特殊流程控制

特殊流程控制-示例:

<?php
//break跳出整個for循環
for($i=1;$i<10;$i++){
    if($i==3){
        break;
    }
    echo '這裏是$i的值:'.$i.'<br/>';
}
echo '<hr/>';
//continue跳出當前循環
for($i=1;$i<10;$i++){
    if($i==3){
        continue;
    }
    echo '這裏是$i的值:'.$i.'<br/>';
}
echo '<hr/>';


echo '這裏是開始部分';
goto jump;
echo '這裏是jump下面的代碼';
jump:
echo '這裏是jump裏面的代碼';

echo '<hr/>';
echo '這裏是結束部分';

php數組

什麼是PHP數組呢?數組是什麼呢?- 數組:數據的集合,在php中數組其實是一個有序映射。

經過array()形式聲明:

  1. array()空數組
  2. array(值1,值2...)下標連續的索引數組,數組的下標從0開始
  3. array(key=>value,key=>value...)能夠聲明索引數組和關聯

經過:print_r打印數組

數組或者混合數組:

  1. 數組的鍵名能夠是整型或者字符串型
  2. 若是鍵名不是整型或者字符串型,會作以下的強制轉換
  3. 包含有合法整型值的字符串會轉換爲整型
  4. 浮點數取整轉換成整型
  5. 布爾true轉換爲1,false轉換爲0
  6. null轉換爲空字符串
  7. 數組和對象不能用做鍵名

動態和快速建立數組

動態建立數組:

  1. $數組名稱[]:下標連續的索引數組
  2. $數組名稱[數字]:指定數組索引
  3. $數組名稱[字符串]:關聯數組

快速建立數組-示例格式:

range($min, $max[$step=1]); 快速建立索引數組

compact($varname,...);快速建立關聯數組

學習小示例:

<?php
// $arr = array();
// var_dump($arr);
//索引數組 下標是從數字開始的
$arr = array(
    1,
    5.5,
    false,
    'dada'
);
print_r($arr);
echo '<hr/>';

//array(key=>value,key=>value...)
$arr1 = array(
  5=>'dada',
  6=>12,
    9=>false,
    4=>4.4
);
print_r($arr1);
echo '<hr/>';

//關聯數組,下標是字符串
//username 能夠稱呼爲咱們的鍵名,
//咱們的鍵名所對應的值就是鍵值
$arr2 = array(
  'username'=>'dada',
    'password'=>123456,
    'age'=>27
);
print_r($arr2);
echo '<hr/>';

//索引+關聯混合使用
$arr3 = array(
  1,2,3,4,5,
    'username'=>'dadaqianduan',
    'addr'=>'haha'
);
print_r($arr3);
echo '<hr/>';

$arr3['username'] = 'dada';
print_r($arr3);

經過數組指針函數遍歷數組

  1. current($arr),獲得數組當前指針所在位置元素的鍵值
  2. key($arr),獲得數組當前指針所在位置元素的鍵名
  3. next($arr),將數組指針向下移動一位,而且獲得數組指針所在位置元素的鍵值
  4. prev($arr),將數組指針向上移動一位,而且返回當前指針所在位置元素的鍵值
  5. end($arr),將數組指針移動到數組的末尾,而且返回當前元素的鍵值
  6. reset($arr),將數組指針移動到數組的開始,而且返回當前元素的鍵值
經過foreach遍歷數組
foreach(數組名稱 as $key=>$val){}

經過list和each遍歷數組

  1. list($var[,$var...]):把數組中的值賦給一些變量
  2. each($arr)返回數組中當前的鍵/值對並將數組指針向前下移動一位

用戶列表頁面

如何建立用戶列表頁面,示例代碼格式以下:

<tr style="text-align:center;">
</tr>
<?php foreach($userInfo as $val){
?>
<tr style="text-align:center;">
 <td><?php echo $val['id'];?></td>
 <td><img src="img/<?php echo $val['id'];?>" alt=""/></td>
</tr>
 <?php
 }?>

添加留言頁面

如何添加留言頁面,示例代碼格式以下:

<body>
 <h2>添加留言頁面</h2>
 <form action="doAction.php?act=add" method="get">
  <table border="1" width="80%" cellpadding="0" cellspacing="0" bgcolor="blue">
  <tr>
   <td>留言者</td>
   <td><input type="text" name="username" id="" placholder="請輸入您的呢稱"/></td>
  </tr>
  </table>
 </form>
</body>

提交反映-doAction.php

<?php
$username = $_GET['username'];
$title = $_GET['title'];
$content = $_GET['content'];

$arr[] = array(
 'username' => $username,
 'title' => $title,
 'content' => $content
);
print_r($arr);

收集留言信息:

$filename = 'text.txt';
$data = 1;
file_put_contents($filename, $data);

<input type="hidden" name="act" value="add"/>

?php 
$username = isset($_GET['username']) ? $_GET['username'] : '';
$time = date('Y-m-d h:i:s');
$act = isset($_GET['act']) ? $_GET['act']:''; // 是不是添加頁面

// 判斷
if(file_exists($filename) && filesize($filename)>0){
 $str = file_get_contents($filename);
 $arr = unserialize($str);
}

if($act == 'add'){
 ...
 $arr = serialize($arr);
 file_put_contents($filename, $arr);
}
if($act == 'add') {
 $arr[] = array(
  'username' => $username,
  'title' => $title,
  'content' => $content,
  'time' => $time
 );
 $arr = serialize($arr);
 if(file_put_contents($filename, $arr)){
  echo'添加留言成功';
 }else{
  echo '添加留言失敗';
 };
}

php函數

總結9點經常使用函數,下面來看看它們各有什麼含義以及做用:

  1. strlen($string)獲得字符串長度
  2. 查找字符串:
  • strpos($string,$search[,$offset]):在指定字符串中查找目標字符串第一次出現的位置
  • stripos($string,$search[,$offset]):忽略大小寫的去查找
  • strrpos($string,$search[,$offset]):在指定字符串中查找目標字符串最後一次出現的位置
  • strripos($string,$search[,$offset]):忽略大小寫的去查找最後一次出現的位置
  • strstr|strchr($string,$search[,$before_needle]):查找字符串的首次出現,返回的是字符串
  • strrchr($string,$search):查找指定字符在字符串中的最後一次出現
  • stristr($string,$search[,$before_needle]):忽略大小寫的去查找
  • str_replace($search,$replace,$string):在指定字符串中去查找另一個字符串,找到以後將其替換成指定字符串
  • str_ireplace($search,$replace,$string):忽略大小寫的去查找並替換
  1. 字符串大小寫
  • strtolower($string):返回小寫以後的字符串
  • strtoupper($string): 返回大寫以後的字符串
  • ucwords($string):單詞的首字母大寫
  • ucfirst($string):字符串的單詞的首字母大寫
  • lcfirst($string):字符串的單詞的首字母小寫
  1. 字符ASCII
  • ord($char):獲得指定字符的ASCII
  • chr($ascii):根據ASCII獲得指定的字符
  1. 字符串的截取
  • substr($string,$start[,$length]):截取字符串
  • substr_replace($string,$replace,$start[,$length]):替換字符串的子串
  1. 加密
  • md5($string): 計算字符串的md5的散列值,返回32位長度的字符串
  • sha1($string): 計算字符串的sha1的散列值,返回40位長度的字符串
  1. 過濾:
  • trim($string[,$charlist]):默認過濾字符串兩端的空格,也能夠過濾指定字符串
  • ltrim($string[,$charlist]):過濾字符串左端
  • rtrim | chop($string[,$charlist]):過濾字符串右端
  • strip_tags($string[,$allowTag]):過濾字符串中的html標記
  • addslashes($string):使用反斜線引用字符串中的特殊字符
  • htmlentities($string[,$flag=ENT_COMPAT]):將全部字符轉換成HTML實體
  • htmlspecialchars($string[,$flag=ENT_COMPAT]:將字符串中的特殊字符轉換成HTML實體
  • nl2br($string):將字符串中的\n<br/>替換
  1. 拆分/合併
  • explode($delimiter,$string)將指定字符串拆分紅數組
  • implode | join($delimiter,$array)以指定分隔符將數組中的鍵值鏈接成字符串
  • str_split($string[,$split_length=1])將字符串轉換成數組
  1. 經常使用函數
  • strrev($string)反轉字符串
  • str_shuffle($string)隨機打亂字符串
  • str_repeat($string)重複字符串
  • str_getcsv(...)解析csv字符串爲一個數組
  • parse_str($str[,$arr])將字符串解析成多個變量
接下來以表格的形式展現以下內容

數學函數庫表格以下:

函數 說明
abs($number) 求絕對值
ceil($number) 進一取整
floor($number) 舍掉小數部分
round($number,$percision) 四捨五入
pow($base,$exp) 冪運算
sqrt($number) 平方根
max($val1,$val2,..) 求最大值
min($val1,$val2...) 求最小值
mt_rand($min,$max) 產生隨機數

日期時間函數庫表格以下:

函數 說明
date_default_timezone_get() 獲得默認時區
date_default_timezone_set($timezone) 設置默認時區
date($format[,$time]) 獲得服務器的日期時間
time() 獲得當前的時間戳
mktime() 取得一個日期的unix時間戳
getdate($timestamp) 取得日期時間信息
gettimeofday($return_float) 取得當前時間
microtime([$get_as_float]) 返回當前unix時間戳和微妙數
strtotime($time[,$now=time()]) 將任何英文文本的日期時間描述解析爲unix時間戳

建立數組操做

函數 描述
range($min, $max[,$step=1]) 快速建立下標連續的索引數組
compact($varname,$varname...) 快速建立關聯數組
array_fill($start_index,$num,$value) 用給定的值填充數組
array_fill_keys($keys,$value) 使用指定的鍵和值填充數組
array_combine($keys,$values) 建立一個數組,用一個數組的值做爲其鍵名,另一個值做爲其鍵值

鍵值相關操做表格以下:

函數 描述
count() 計算數組中的單元數目或對象中的屬性個數
array_keys($array) 取得數組的鍵名做爲下標連續的索引數組返回
array_values($array) 取得數組的鍵值做爲下標連續的索引數組返回
array_filp($array) 交換數組中的鍵名和賦值
in_array() 檢測數組中是否存在某個值
array_search() 在數組中搜索給定的值,若是成功則返回相應的鍵名
arry_key_exists() 檢查給定的鍵名或索引是否存在於數組中
array_reverse() 數組倒置
shuffle() 打亂數組的元素
array_rand() 隨機取出數組的鍵名
array_unique() 移除數組中重複的值
array_sum() 統計數組中元素值的總和

數組指針函數表格以下:

函數 描述
key($array) 獲得當前指針所在位置元素的鍵名
current($array) pos($array) 獲得當前指針所在位置元素的鍵值
next($array) 將數組指針向下移動一位,而且返回當前指針所在位置元素的鍵值
prev($array) 將數組指針向上移動一位,而且返回當前指針所在位置元素的鍵值
end($array) 將數組指針移動到數組的末尾,而且返回當前指針所在位置元素的鍵值
reset($array) 將數組指針移動到數組的開始,而且返回當前指針所在位置元素的鍵值
each($array) 返回數組中當前的鍵值對,並將數組指針向下移動一位
list($var,...) 將數組中元素的值賦給對應的變量
array_unshift($array,$value...) 在數組開頭插入一個元素或者多個元素
array_shift($array) 彈出數組的第一個元素
array_push($array,$value...) 在數組末尾壓入一個元素或者多個元素
array_pop($array) 彈出數組的最後一個元素

數組的拆分與合併表格以下:

函數 描述
array_slice($array,$offset) 截取數組
array_merge() 合併數組

自定義函數的使用

如何聲明函數呢?來看看以下代碼:

function 函數名稱([參數...]){
 函數體;
 return 返回值;
}

注意事項:

  • 函數名稱不要包含特殊字符,以字母或者下劃線開始,跟上數字字母下劃線
  • 函數名稱最好含義明確,最好以動詞開頭
  • 函數名稱最好遵照駝峯標記或者下劃線法
  • 函數名稱不支持重名
  • 函數名稱不區分大小寫,但調用的時候最好遵循大小寫
  • 函數參數不是必須的
  • 函數默認返回Null,也能夠經過return添加返回值

接下來咱們看看帶入的函數參數:

參數分爲形參和實參:

形參,定義函數時聲明的參數(必選參數:調用函數的時候必選要傳參;可選參數:調用函數的時候若是不傳參數,使用默認值;)

實參,調用函數時實際傳入的參數

接下來了解變量的做用域,以下思惟導圖:

接下來講說函數的傳值和傳引用區別:

  1. 函數的傳值在函數體內對變量作更改不影響變量自己
  2. 傳引用在函數體內對變量作更改影響變量自己

回調函數

回調函數是什麼呢?

在開發過程當中,有時候但願針對一個對象或者一個值執行多個不相干的操做,那麼運用回調將是最好的方式。

<?php
function text1(){
 echo '我是達達';
}
function text2($username){
 echo '我是哪吒';
}
// 回調函數:函數體內的名稱是咱們要傳入的參數();
function callBack($call,$str){
 $call($str);
}
// 回調函數的使用就是傳入的參數是你想要回調的函數名稱
callBack('text2','dadaqianduan');

遞歸函數

什麼是遞歸函數,即函數體本身調用本身自己

寫法示例:

function text($i) {
 echo $i;
 $i--;
 if($i>=0){
  text($i);
 }
}

text(2);

匿名函數

匿名函數示例:

$str = function() {
 echo 'dadaqianduan';
};
$str();

$str1 = function($username) {
 echo 'dada';
 echo $username;
};
$str1('哪吒');

php包含文件

php的文件包含:include,include_once,require,require_once,就是將一個文件的內容包含進另一個文件。

  • require引用文件出錯的時候 是一個報錯一個警告
  • include引用文件出錯的時候 是兩個警告
  • 錯誤處理:require會生成致命錯誤並中止腳本
  • 錯誤處理:include只會生成警告,而且腳本會繼續

因此這裏建議你使用include哦!

includerequire語句會獲取指定文件中存在的全部文本,代碼,標記,並複製到使用include語句文件中。

語法格式以下:

include 'filename';
或
require 'filename';

php include示例:

讓咱們來建立要給名爲'dada.php'的標準的頁腳文件,代碼以下:

<?php
 echo '<p> 達達 哪吒</p>';
?>

而後須要在另外一個頁面中引用這個頁腳文件以下:

<html>
 <body>
  <p>魔王哪吒</p>
  <?php include 'footer.php'; ?>
 </body>
</html>

require_once/include_once,與require/include做用相同,不一樣在於執行到時會先檢查目標內容是否是在以前已經導入過,若是導入過了,那麼便不會再次重複引入其一樣的內容。

面向對象

首先了解面向對象是什麼呢?

它是一種思想,是一種開發方式,並非實際的代碼。

談到面向對象,就要說到面向對象與面向過程的區別:

  1. 其實面向過程強調的是功能行爲(一件事怎麼作)
  2. 面向對象是將功能封裝到對象,強調具有了功能的對象(一件事誰來作)
  3. 面向對象的特色:繼承,封裝,多態

面向的幾種方式:

OOA(Object Oriented Analysis)面向對象分析

OOD(Object Oriented Design)面向對象設計

OOP(Object Oriented Programming)面向對象編程

類和對象

說到面向對象就離不開類和對象的關係:類是具體事務的抽象,對象是這個類的具體實例。

怎麼樣定義一個類,類的定義:(相似class關鍵字來定義的)

class Person{
}

<?php
// 定義一我的類
class Person{
 // 類裏面是有屬性和方法存在的
 // public 訪問修飾符
 public $userName = 'dada';
 public $age = 12;
}
// 經過new 關鍵字來建立咱們的對象
$p = new Person();
echo $p->userName.'<hr/>';
echo $p->age.'<hr/>';

屬性講了,說說方法吧,以下示例:

<?php
class Person{
 public $userName;
 public $age;
 // 類裏面的行爲稱爲方法
 public function eat() {
  echo '我要吃飯';
 }
}
$p = new Person();
$p->eat();

對象在內存的分配

來講一下對象的內存分析,在PHP中,內存被劃分爲四個:

  1. 數據段:用來存放程序中已初始化且不爲0的全局變量如:靜態變量和常量
  2. 代碼段:存放函數,方法
  3. 棧空間段:存放小數據
  4. 堆空間段:存放對象和數據量比較大的引用

php訪問修飾符

訪問修飾符有哪些呢?以下展現:

  1. public公共的,默認
  2. protected受保護的
  3. private私有的

代碼示例以下

<?php
class Da{
 public $userName = 'dada';
 protected $age = 12;
 public function eat() {
  echo '我要吃飯';
 }
}
$da = new Da();
echo $da->userName

echo $da->age // 報錯

修改以下:

<?php
class Da{
 public $userName = 'dada';
 protected $age = 12;
 public function eat() {
  echo '我要吃飯';
  //$this
  echo $this->age;
 }
}
$da = new Da();
echo $da->userName

echo $da->eat()

構造函數和析構函數

首先什麼是構造函數呢?構造函數是經過new對象的時候會被調用的。

其次析構函數是什麼?析構函數首先不能帶有參數,析構函數會在對象的全部引用被刪除或者顯示的消失以前被調用。

<?php
class Person {
 public $userName;
 public $age;
 // php5.5以前的寫法
 // public function Person() {
 //  echo '我是構造函數';
 // }
 // 經過一個魔術常量來寫構造函數
 public function _construct($userName,$age) {
  // $this表示的是當前對象
  $this->userName = $userName;
  $this->age = $age;
 }
 // 析構函數
 public function _destruct(){
  echo '析構函數'
 }
}
$p1 = new Person('dada',12);
echo $p1->userName
$p1 = null; // 析構函數被調用

set和get魔術方法

瞭解set和get方法:set對外界提供設置成員屬性的方法,而get對外界提供訪問成員屬性的方法。

因此魔術常量:_set_get

以下示例:

<?php
class Person{
 private $userName;
 private $age;
 public function setAge($age){
  // $this->age = 12;
  // $this-age == private $age;
  $this->age = $age;
 }
 public function getAge(){
  return $this->age;
 }
 public function _set($key,$value){
  $this->userName = $value;
 }
 public function _get($key){
 return $this->userName;
}
$p = new Person();
// echo $p->userName;
$p->setAge(16);
echo $p->getAge();

isset和unset魔術方法

  1. _isset當外部調用isset()函數檢測不可訪問的屬性或者不存在的屬性時自動調用。
  2. _unset當在類外部調用unset銷燬不可訪問屬性時自動調用。

以下示例表示:

<?php
class Person{
 private $userName;
 private $age;
 public $abc;
 public function _construct($userName,$age){
  $this->userName=$userName;
  $this->age=$age;
 }
 public function _isset($name){
  echo '當外部調用isset()函數檢測不可訪問的屬性或者不存在的屬性時自動調用';
  return isset($name); // boolean
 }
 public function _unset($name){
  echo '當在類外部調用unset銷燬不可訪問屬性時調用';
 }
}
$p = new Person('dada',12);
var_dump(isset($p->userName));
// echo '<hr/>'
unset($p->abc);

繼承

下面來講說面向對象的繼承,封裝,多態中的繼承特色:

那麼繼承的意義在於哪裏,用繼承能夠減小重複代碼,經過extends關鍵字來繼承。

代碼示例以下:

<?php
class Person{
 public $userName;
 public $age;
 public function eat(){
  echo 'dadaqianduan';
 }
}
class Student extends Person{
}
$stu = new Student();
echo $stu->eat();

使用parent關鍵字

繼承中使用parent,代碼以下:

<?php
class Person {
 public $userName='parent';
 public $age = 100;
 protected function eat() {
  echo `老爸要吃飯`;
 }
}
class Student extends Person {
 public $userName = 'children`;
 public $age = 12;
 // 重寫 須要訪問的修飾符必須和父類的平級或者大於父類,方法名字相同
 public function eat() {
  parent::eat().'<hr/>';
  echo 'children';
 }
}
$stu = new Student();
echo $stu->eat();

使用final關鍵字

使用final關鍵字注意事項:

  • final關鍵字不能修飾屬性
  • final修飾過的class和方法不能被繼承或者重寫

使用static關鍵字

static用於表示靜態的意思:

  1. static所修飾的屬性和方法都是靜態的屬性和方法
  2. 靜態的屬性和方法的特色是不用經過對象來調用屬性和方法
  3. 能夠經過類名來調用屬性和方法

下面代碼示例以下:

class Person {
 public static $i = 1;
 public static function eat(){
  echo '要吃飯';
 }
}
echo Person::$i;
Person::eat();

self在類內部經過self來訪問靜態的屬性和方法:

下面代碼示例以下:

class Student {
 public static $i = 1;
 public static function eat(){
  echo self::$i;
 }
}
Student::eat();

下面示例靜態綁定的用法以下:

<?php
class A{
 public static function text1(){
  echo 'text1';
 }
 public static function text2(){
  echo 'text2';
  self::text1();
 }
}
class B extends A {
 public static function text1(){
  echo 'B-A';
 }
}
B::text2();

使用const關鍵字

const,爲常量修飾符,常量的特色,不能被修改,惟一的標識符,注意以下:常量要大寫,不能經過對象來訪問,不須要加$符號。

學生管理系統

示例鏈接數據庫:

<?php
header("content-type:text/html;charset=urf-8");
// 創建鏈接而且返回鏈接對象
$link = mysqli_connect('localhost','root','root') or die('鏈接失敗');
// 設置字符集
mysqli_set_charset($link,'utf8');
// 打開指定數據庫
mysqli_select_db($link, 'dadaqianduan');
// 執行sql語句
$query = "insert user values(1,'dada','12345')「;
$res = mysqli_query($link, $query);
if($res){
 echo '插入數據成功';
}else{
 echo '插入數據失敗';
}

因此mysqli操做數據庫的步驟有:

  1. 鏈接mysql
  2. 設置字符集
  3. 打開指定數據庫
  4. 執行sql查詢
  5. 釋放結果集
  6. 關閉鏈接

若是每次使用都要重寫鏈接數據庫,那麼咱們能夠進行封裝:

封裝數組:config.php

<?php
$config = array(
    'host'=>'localhost',
    'user'=>'root',
    'password'=>'root',
    'charset'=>'utf8',
    'dbName'=>'dadaqianduan'
);


define('DB_HOST','localhost');
define('DB_USER','root');
define('DB_PWD','root');
define('DB_CHARSET','utf8');
define('DB_DBNAME','dadaqianduan');

鏈接

<?php
/**
 * 鏈接
 * @param string $host
 * @param string $user
 * @param string $password
 * @param string $charset
 * @param string $database
 * @return object 鏈接標識符
 */
function connect1($host,$user,$password,$charset,$database){
 $link = mysqli_connect($host,$user,$password) or die('數據庫鏈接失敗');
 mysqli_set_charset($link,$charset);
 mysqli_select_db($link,$database) or die('指定數據庫打開失敗');
 return $link;
}

鏈接 須要傳遞數組

/**
 * 鏈接 須要傳遞數組
 * @param array $config
 * @return object
 */
function connect2($config){
 $link=mysqli_connect($config['host'],$config['user'],$config['password']);
 mysqli_set_charset($link,$config['charset']);
 mysqli_select_db($link,$config['dbName'] or die('指定數據庫打開失敗');
 return $link;
}

用常量的形式創建鏈接

/**
 * 用常量的形式創建鏈接
 * @return unknown
 */
function connect3(){
 $link = mysqli_connect(DB_HOST,DB_USER,DB_PWD) or die('數據庫鏈接失敗');
 mysqli_set_charset($link,DB_CHARSET);
 mysqli_select_db($link,DB_DBNAME) or die('指定數據庫打開失敗');
 return $link;
}

插入操做

/*
 array(
 'username'=>'dada',
 'password'=>'dada',
 'age'=>'123456',
 'regTime'=>'12345'
 );
 INSERT user(username,password,age,regTime) VALUES('dada','dada','12','123123123');
 */
/**
 * 插入操做
 * @param object $link
 * @param array $data
 * @param string $table
 * @return boolean
 */
// 插入的封裝
function insert($link,$data,$table){
 $keys=join(',',array_key($data));
 $vals = "'".join("','", array_values($data))."'";
 $query = "insert{$table}({$keys})values({$vals})";
 $res = mysqli_query($link,$query);
 if($res){
  return mysqli_insert_id($link);
 }else{
  return false;
 }
}

更新操做

/*
 array(
         'username'=>'dada',
         'password'=>'dada',
         'age'=>'12',
         'regTime'=>'123123123'
 );
 UPDATE user SET username='dada',password='dada',age='12',regTime='123123123' WHERE id=1
*/
/**
 * 更新操做
 * @param object $link
 * @param array $data
 * @param string $table
 * @param string $where
 * @return boolean
 */
function update($link, $data, $table, $where = null) {
    foreach ( $data as $key => $val ) {
        $set .= "{$key}='{$val}',";
    }
    $set = trim ( $set, ',' );
    $where = $where == null ? '' : ' WHERE ' . $where;
    $query = "UPDATE {$table} SET {$set} {$where}";
    $res = mysqli_query ( $link, $query );
    if ($res) {
        return mysqli_affected_rows ( $link );
    } else {
        return false;
    }
}

刪除操做

//DELETE FROM user WHERE id=
/**
 * 刪除操做
 * @param object $link
 * @param string $table
 * @param string $where
 * @return boolean
 */
function delete($link, $table, $where = null) {
    $where = $where ? ' WHERE ' . $where : '';
    $query = "DELETE FROM {$table} {$where}";
    $res = mysqli_query ( $link, $query );
    if ($res) {
        return mysqli_affected_rows ( $link );
    } else {
        return false;
    }
}

查詢全部記錄

/**
 * 查詢全部記錄
 * @param object $link
 * @param string $query
 * @param string $result_type
 * @return array|boolean
 */
function fetchAll($link, $query, $result_type = MYSQLI_ASSOC) {
    $result = mysqli_query ( $link, $query );
    if ($result && mysqli_num_rows ( $result ) > 0) {
        while ( $row = mysqli_fetch_array ( $result, $result_type ) ) {
            $rows [] = $row;
        }
        return $rows;
    } else {
        return false;
    }
}

獲得表中的記錄數

/**
 * 獲得表中的記錄數
 * @param object $link
 * @param string $table
 * @return number|boolean
 */
function getTotalRows($link, $table) {
    $query = "SELECT COUNT(*) AS totalRows FROM {$table}";
    $result = mysqli_query ( $link, $query );
    if ($result && mysqli_num_rows ( $result ) == 1) {
        $row = mysqli_fetch_assoc ( $result );
        return $row ['totalRows'];
    } else {
        return false;
    }
}

獲得結果集的記錄條數

/**
 * 獲得結果集的記錄條數
 * @param object $link
 * @param string $query
 * @return boolean
 */
function getResultRows($link, $query) {
    $result = mysqli_query ( $link, $query );
    if ($result) {
        return mysqli_num_rows ( $result );
    } else {
        return false;
    }
}

獲取信息的封裝:

/**
 * @param object $link
 */
function getServerInfo($link) {
    return mysqli_get_server_info ( $link );
}
/**
 * @param object $link
 */
function getClientInfo($link) {
    return mysqli_get_client_info ( $link );
}

/**
 * @param object $link
 */
function getHostInfo($link){
    return mysqli_get_host_info($link);
}

/**
 * @param object $link
 */
function getProtoInfo($link) {
    return mysqli_get_proto_info ( $link );
}

Redis初識

下面展現介紹,思惟導圖以下:

Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它能夠用做數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(list), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不一樣級別的 磁盤持久化(persistence), 並經過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。

優勢:

  1. 常駐內存,讀寫性能優越,遠勝於硬盤IO
  2. 支持多種數據格式,能實現多種業務須要
  3. 能夠自動保存數據到硬盤,服務重啓時恢復,服務穩定持久

操做Redis 安裝

Window 下安裝
下載地址:https://github.com/tporadowski/redis/releases

Redis 支持 32 位和 64 位。這個須要根據你係統平臺的實際狀況選擇,這裏咱們下載 Redis-x64-xxx.zip壓縮包到 C 盤,解壓後,將文件夾從新命名爲 redis


打開文件夾,內容以下:

打開一個 cmd 窗口 使用 cd 命令切換目錄到xxx:\redis 運行:

redis-server.exe redis.windows.conf


另啓一個 cmd 窗口,原來的不要關閉,否則就沒法訪問服務端了。

Windows快速配置PHP+MySQL環境變量(phpStudy)

設置一下是否生效:

ComposerPHP 用來管理依賴(dependency)關係的工具。你能夠在本身的項目中聲明所依賴的外部工具庫(libraries),Composer 會幫你安裝這些依賴的庫文件。

https://getcomposer.org/


點擊Getting Started

點擊下載:

https://developer.aliyun.com/composer?spm=a2c4e.11153940.0.0.40eb6995J6zupg

檢查:

Windows快速配置NodeJS

配置淘寶鏡像源的命令行:

npm config set registry http://registry.npm.taobao.org

Windows快速配置Bower

Windows下使用phpStudy安裝

使用騰訊雲服務器

fastadmin.net/go/tencent

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
下載

https://www.bt.cn/?invite_code=MV9veWhubmU=

點擊當即安裝
https://www.bt.cn/bbs/thread-19376-1-1.html

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

域名的解析

錯誤:

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at admin@php.cn to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

修改.htaccess 爲如下內容

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
  • Node.js (可選,用於安裝Bower和LESS,同時打包壓縮也須要使用到)
  • Composer (可選,用於管理第三方擴展包)
  • Bower (可選,用於管理前端資源)
  • Less (可選,用於編輯less文件,若是你須要增改css樣式,最好安裝上)

點關注,不迷路

好了各位,以上就是這篇文章的所有內容,能看到這裏的人都是人才。我後面會不斷更新技術相關的文章,若是以爲文章對你有用,歡迎給個「贊」,也歡迎分享,感謝你們 !!

相關文章
相關標籤/搜索