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
注意:如果是找不到則返回false16、isset
判斷一個變數是否存在。
比如,當一個json解析之後,我們要看其中一個欄位是否存在,比如這個請求返回的是正確還是錯誤,如果返回正確,那麼欄位裡面沒有'error';如果返回錯誤,返回的欄位裡面有'error',我們不能直接:
if($obj->{'error'} == null)
{
exit('返回錯誤');
}else
{
exit('返回正確');
}
這樣判斷是不行的,當物件裡面沒有error的時候,你這樣訪問頁面要報錯,正確的方法是:
if(isset($obj->{'error'}))
{
exit('返回錯誤');
}else
{
exit('返回正確');
}