1. 程式人生 > >PHP從零開始學習筆記

PHP從零開始學習筆記

1、指令碼標籤

<?php
// PHP 程式碼
?>

2、輸出

有兩種在瀏覽器輸出文字的基礎指令:echo 和 print

echo - 可以輸出一個或多個字串
print - 只允許輸出一個字串,返回值總為 1
echo 輸出的速度比 print 快, echo 沒有返回值,print有返回值1。

<?php
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
echo "This", " string", " was", " made", " with multiple parameters.";
?>

3、變數

以$開頭,大小寫敏感

<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>

4、弱型別

弱型別,不必宣告型別

5、常量

<1>(整個指令碼中)自動全域性

<2>沒有$開頭

<3>可以設定(常量名)大小寫是否敏感

<?php
define("GREETING", "Hello World!");
echo GREETING;
?>

<?php
define("GREETING", "Hello World", true);
echo greeting;
?>

<4>在函式內直接引用常量,不需要像變數那麼麻煩

 <!DOCTYPE html>
<html>
<body>

<?php
define("GREETING", "Hello World!");
function test()
{
	echo GREETING;//可以正常輸出
}
test();
?>  

</body>
</html>
<5>函式外可以直接引用函式內定義的常量
 <!DOCTYPE html>
<html>
<body>

<?php

function test()
{
	define("GREETING", "Hello World!");
}
test();
echo GREETING;//正常輸出
?>  

</body>
</html>

6、變數作用域

<1>函式內不能直接訪問全域性變數

<?php 
$x=5; // 全域性變數 

function myTest() 
{ 
    $y=10; // 區域性變數 
    echo "<p>測試函式內變數:<p>"; 
    echo "變數 x 為: $x"; //這樣的方法訪問不到全域性的$x,所以這裡輸出為空
    echo "<br>"; 
    echo "變數 y 為: $y"; 
}  

myTest(); 

echo "<p>測試函式外變數:<p>"; 
echo "變數 x 為: $x"; 
echo "<br>"; 
echo "變數 y 為: $y"; 
?>
<2>使用$GLOBAL可以在函式內訪問全域性變數
<?php
$x=5;
$y=10;

function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 

myTest();
echo $y;//15
?>
<3>static作用域

定義在函式內的變數,每次呼叫完都是清空的,但是加了static他就可以儲存住

<?php 

function myTest() 
{ 
    static $x=0; 
    echo $x; 
    $x++; 
} 

myTest(); //0
myTest(); //1
myTest(); //2
?> 
對於全域性變數來說,有沒有static沒有差別
<?php 

static $x=0;

function myTest() 
{ 
    echo $GLOBALS['x'];
    $GLOBALS['x']++; 
} 

myTest(); //0
myTest(); //1
myTest(); //2
?> 
對一個區域性變數來說,加了static並不會改變他的作用域
<?php 

function myTest() 
{ 
    static $x = 0;
    echo $x;
    $x++;
} 
echo $x;//注意,這裡會提示此變數未定義
myTest(); 
myTest(); 
myTest(); 
?> 

7、資料型別

String(字串), Integer(整型), Float(浮點型), Boolean(布林型), Array(陣列), Object(物件), NULL(空值)

可以說一個Array搞定一切

<1>整型

<?php 
$x = 5985;
var_dump($x);
echo "<br>"; 
$x = -345; // 負數 
var_dump($x);
echo "<br>"; 
$x = 0x8C; // 十六進位制數
var_dump($x);
echo "<br>";
$x = 047; // 八進位制數
var_dump($x);
?>
<2>浮點型
<?php 
$x = 10.365;
var_dump($x);
echo "<br>"; 
$x = 2.4e3;
var_dump($x);
echo "<br>"; 
$x = 8E-5;
var_dump($x);
?>
<3>布林型
$x=true;
$y=false;
<4>陣列
<?php 
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>

-數組裡面可以是鍵值對,還可以用"+"將兩個陣列連線成一個數組

<!DOCTYPE html>
<html>
<body>

<?php
$x = array("a" => "red", "b" => "green"); 
$y = array("c" => "blue", "d" => "yellow"); 
$z=$x+$y;
echo $z['a'];
$x['a']="black";
echo "<br>";
echo $z['a'];//red
echo "<br>";
echo $x['a'];//black
?>   

</body>
</html>
可以看到這個$z已經把所有元素複製過去,而非僅僅是一個引用,改變了原陣列的元素,並不會改變$z的元素。
-count可以返回陣列長度
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>
-遍歷陣列
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
-關聯陣列(鍵值對)
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//建立方法1
//建立方法2
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";

<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
-遍歷關聯陣列
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

foreach($age as $myKey=>$myValue)
{
echo "Key=" . $myKey . ", Value=" . $myValue;
echo "<br>";
}
?>
<5>物件
<?php
class Car
{
  var $color;
  function Car($color="green") {
    $this->color = $color;
  }
  function what_color() {
    return $this->color;
  }
}
?>
<6>NULL
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>

8、運算子

<1>三元運算子

<?php
$test = '菜鳥教程';
// 普通寫法
$username = isset($test) ? $test : 'nobody';//isset判斷bool值,string是否已賦值
echo $username, PHP_EOL;

// PHP 5.3+ 版本寫法
$username = $test ?$test."hello": 'nobody';
//$username = $test ?: 'nobody';//也可以這樣省略
echo $username, PHP_EOL;//PHP_EOL是換行符
?>

9、陣列排序

<1>sort()升序排列

<?php
$cars=array("Volvo","BMW","Toyota");
sort($cars);
echo "$cars[0]";//BMW,字母小的排前面
?>

<?php
$numbers=array(4,6,2,22,11);
sort($numbers);
echo "$numbers[0]";//2,數值小的排前面
?>

<2>rsort()降序排列

<3>asort()根據值升序排列

<4>ksort()根據鍵升序排列

<5>arsort()根據值降序排列

<6>krsort()根據鍵降序排列

<7>陣列倒轉(順序反過來):

$orders = array_reverse($orders);


10、超級全域性變數

<1>$GLOBALS

用來引用全域性變數

<2>$_SERVER

<?php 
echo $_SERVER['PHP_SELF'];//當前指令碼的檔名
echo "<br>";
echo $_SERVER['SERVER_NAME'];//主機名(域名)
echo "<br>";
echo $_SERVER['HTTP_HOST'];//請求頭中host的內容
echo "<br>";
echo $_SERVER['HTTP_REFERER'];//引導使用者代理到當前頁的前一頁的地址(該值不可信)
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];//
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];//包含當前指令碼的路徑
?>
<3>$_REQUEST

用於收集HTML表單提交的資料

<4>$_POST

收集表單資料

<5>$_GET

11、面向物件,成員函式呼叫(->)

<?php
class Site {
  /* 成員變數 */
  var $url;
  var $title;

  function __construct( $par1, $par2 ) {
    $this->url = $par1;
    $this->title = $par2;
  }
  /* 成員函式 */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}

$runoob = new Site('www.runoob.com', '菜鳥教程');
$taobao = new Site('www.taobao.com', '淘寶');
$google = new Site('www.google.com', 'Google 搜尋');

// 呼叫成員函式,獲取標題和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();

$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();
?>

12、程式碼的引用

include、require、use

include、require:相當於把程式碼包含進來,就是那個引用的檔案把這一行程式碼代替了,這個要包含的檔案 必須是<?php?>包含的,路徑最好用正斜槓

include如果找不到會報一個警告然後繼續執行,require則會報錯誤並且停止執行,如果是系統配置,缺少了不能允許,則我們應該用require

include_once、require_once:加了once之後,系統會判斷,如果已經添加了,則不會新增第二次,但是系統做這個判斷效率會降低,因此應該儘量靠系統架構使其不會重複載入,然後程式碼上面儘量不要用once影響效率

use:相當於java的import

a.php

<?php 
	$a++;
?>

b.php
<?php
	$a=5;
	require_once("a.php");
	echo $a;//6
	require_once("a.php");
	echo $a;//6,如果用了require則為7,因為他不管有沒有載入過都會再次載入
?>

13、單引號與雙引號

單引號不解釋(直接輸出),雙引號會經過解釋


14、ceil的使用

            // 測試例項如下:
            $total1 = 40;
            echo 'page_num1='.ceil($total1/30);//2
            $total2 = 30;
            echo 'page_num2='.ceil($total2/30);//1
            $total3 = 20;
            echo 'page_num3='.ceil($total3/30);//1
            $total4 = 0;
            echo 'page_num4='.ceil($total4/30);//0

15、字串相關

<0>strlen

-strlen()返回字串長度
<?php 
echo strlen("Hello world!"); 
?>

<1>mb_strlen

上面提到的strlen函式計算字串長度的時候,並非完美。

當字串裡面含有中文的時候,如果是utf-8格式的,每個中文將會計算為3個字元。

因此我們需要另一個統計函式,這個統計函式每個中文只統計為1。

                $length = mb_strlen($item_name,'utf8');

<2>mb_substr

擷取字串,配合mb_strlen使用,第一個引數是原字串,第二個引數是起始位置(從0開始),第三個引數是擷取的長度,第四個引數是編碼。

               $str = mb_substr($item_name,0,10,'utf8');

<3>strpos查詢子字串

-strpos()返回一段字串在另一個字串中的index

<?php 
echo strpos("Hello world!","world"); 
?>

查詢在給定字串內有沒有存在某子字串,如果有則返回其第一次出現的位置,如果沒有則返回false

使用方法:

if (strpos($from,$find) === false)
{
    // 這裡是找不到
}else
{
    // 這裡是找到了
}

<4>strstr根據分隔符擷取

$str1 = strstr($from,$find,true);// 返回分隔符之前的部分,不包含分隔符
$str2 = strstr($from,$find);// 返回分隔符之後的部分,包含分隔符

<5>substr根據index擷取

$str = substr($fromSku2,1);// 從第2個字元開始擷取

<6>防止數字變為科學計數法

$orderId = number_format($orderId,0,'','');

<7>獲取連結的包含副檔名的檔名

$name =  basename($imgUrl);

<8>分割字串返回陣列

$skuArr = mb_split('\s','hello world');
Array (
      [0] => hello
      [1] => world
   )

<9>strripos查詢字串在另一個字串中最後一次出現的位置

$str = 'https://product.suning.com/0070152707/10042045173.html';
        $find = '/';
        $index = strripos($str,$find,0);
        exit('test='.$index);//37
注意:如果是找不到則返回false

16、isset

判斷一個變數是否存在。

比如,當一個json解析之後,我們要看其中一個欄位是否存在,比如這個請求返回的是正確還是錯誤,如果返回正確,那麼欄位裡面沒有'error';如果返回錯誤,返回的欄位裡面有'error',我們不能直接:

if($obj->{'error'} == null)
{
    exit('返回錯誤');
}else
{
    exit('返回正確');
}

這樣判斷是不行的,當物件裡面沒有error的時候,你這樣訪問頁面要報錯,正確的方法是:
if(isset($obj->{'error'}))
{
    exit('返回錯誤');
}else
{
    exit('返回正確');
}