PHP從入門到跑路(二),基礎語法,數據庫操作

前言

博主不會php,  是從JAVA轉過來的,  PHP教程總結實際開發使用, 更加偏向於實際, 理論比較薄弱, 
一直想總結一個學習教程, 可是沒時間. 想快速學習PHP,進行開發的, 請關注博主動態.

一, 變量定義及使用

1, php屬於弱類型語言 “10” + 10 = 20 類型會自動進行轉換
2, 變量定義與大多數語言一樣, 只是變量名需要在開頭添加 $
2.1,php的引用全部都是弱引用,不是地址引用,a 引用了 b, 改變a , b不一定會改變

//變量定義名稱需要 +$
$a = 10;        //整數
$b = 10.0;      //浮點

$str = "hello php";     //字符串

//字符拼接
$str .= "ni hao";       //結果 hello php ni hao

//嵌入變量
$str1 = "hello {$a}";   //結果 hello 10

3, php也有對象一說

/**
 *  對象, 借鑑Java
 *  php分對象和數組, 數組使用比對象多
 */

/*-----------------------------  類定義 ------------------------------- */

//類定義
class Person{
    public $age = 1;
    public $name = "jack";
    //靜態變量
    public static $city = "長沙";

    //函數定義不需要像java一樣提供返回格式
    //就像js一樣
    public function method1(){
        echo "method1";
    }

    //返回參數的方法
    public function method2(){
        return "hello";
    }

    //可以改變傳參的函數, 指針引用需要添加&
    public function method3(&$p){
        //指針改變
        $p -> age = 123;
        // this = 調用對象
        $this -> age = 123;
    }

    //靜態函數
    public static function method4(){
        echo "static method";
    }
}

在使用php對象方法和屬性時需要使用, 對象 -> 方法或者屬性

/** 使用對象屬性, 當然也可以像java那樣封裝起來, 提供getter, setter方法
 *  但是我沒見過有人用
 */
$obj = new Person();
$obj -> age;
$obj -> method1();
$obj -> method2();
$obj -> method3($obj);

//靜態變量, 函數
$city = Person::$city;
Person::method4();

4,數組定義, php語言中大量使用了數組,個人感覺數組的使用超過對象,且數組擁有豐富的api支持, 數組相當於一個java中的object map, key 和 value 都是object類型, object就是任意類型

/*-----------------------------  數組定義 ------------------------------- */

//數組定義, 這個在PHP中使用頻繁, 可以把數組看作java的map, 但比map更方便
//普通定義
$arr1 = array();

//初始化賦值, 可以看到這個和上面的對象一樣, 只是沒有函數
//如果讓我選擇存儲體, 數組是挺好的選擇
$arr2 = array("age"=>1,"name"=>"jack");

//數組添加值
$arr1[] = $arr2;    //這時候的arr1 就變成了一個二維數組

//添加多個值, 參數1 是目標, 參數2,3,4..... 都是值
array_push($arr1,$arr2,$arr2);

//數據可以不一樣, 但實際如果只當數組使用, 建議數據結構一致
$arr1[] = array("sex"=>"男","money"=>"123");

//改變了arr2 中的age值
$arr2['age'] = 2;

$json = "{'age':1,'name':'jack'}";
$arr3 = json_decode($json,1);       //會轉成數組
$obj2 = json_decode($json);         //會轉成對象

5, 數組的日常使用, 循環

/** --------------------------  循環 ------------------------------------ */
$arr = array("hello1","hello2","hello3","hello4","hello5",);
$count = count($arr); //獲得數組長度

for ($i = 0; $i < $count; $i++){
    echo $arr[$i];
}

//增強, 增強for不能改變數組參數
foreach ($arr as $item){
    echo $item;
}

//增強for , 改變數組參數, 使用&對地址進行引用
foreach ($arr as &$item){
    echo $item;
}

//循環鍵值對數組
$arr = array("a"=>1,"b"=>2,"c"=>3);
foreach ($arr as $key => $item){
    //$key  a b c
    //$item 1 2 3
    echo $key ." - ". $item;
}

6, 常用函數

/** -------------------------- 常用函數 ---------------------- */

//時間
$one_day = 86400;   //php 時間格式使用unix時間戳, 按秒計算

//格式化時間
// Y-m-d | Ymd | Y-m-d H:i:s
$today_str = date("Y-m-d",time());      //今天
$yesterday_str =  date("Y-m-d",time() - $one_day);  //昨天

//轉換成unix時間戳
$today_unix = strtotime($today_str);

//字符分割
$str = "hello,world";
$strs = explode(",",$str);

//字符切割
$str1 = substr($str,2,4); //參數2, 開始位置, 參數3中止位置
$str2 = substr($str, 2);         //參數2, 開始以後的字符
$str3 = substr($str, -2);        //參數2, 從-2的位置開始以後的

//md5加密
$md5 = md5("123456");

array 數組擁有大量的api
https://www.runoob.com/php/php-ref-array.html 數組api,

二,數據庫操作

1, 操作數據庫有常用的三個方式,
mysql (已被遺棄)
mysqli 只支持mysql,除第三種方式外使用最廣的
PDO 數據對象(PHP Data Object),支持多種數據庫
2, 貌似在php中使用預定義sql並不多

<?php

class MySql
{

    private $mysqli = null;

    private static $host = "127.0.0.1";
    private static $port = 3306;
    private static $db_name = "test";
    private static $user = "root";
    private static $pass = "root";

    function __construct()	//__construct()是構造函數
    {
        $this->mysqli = new mysqli(self::$host, self::$user, self::$pass, self::$db_name, self::$port);
    }

    function query($sql)	//查詢
    {
        $res = $this->mysqli->query($sql);
        if ($res) {
            $data = array();
            while ($row = $res->fetch_row()) {
                $data[] = $row;
            }
            $res->free();
            return $data;
        } else {
            return NULL;
        }
    }

    function execute($sql)		//執行sql
    {
        $res = $this->mysqli->query($sql);
        if (!$res) {
            return false;
        } else {
            return true;
        }
    }

    function insert($table,$row){
        $stat = '';
        foreach ($row as $k => $v) {
            $value = mysqli_real_escape_string($this->mysqli,$v);	//轉義‘’, 防止sql注入
            $stat .= "`$k` = '$value',";
        }
        $stat = substr($stat, 0, strlen($stat) - 1);
        $sql = "INSERT INTO `{$table}` set $stat";
        $res = $this->mysqli->query($sql);
        if ($res){
            return mysqli_insert_id($this->mysqli);
        }else{
            return 0;
        }
    }
    
    function opentranstion(){
        $this->mysqli->autocommit(false);	//開啓事務
    }

    function commit(){
        $this->mysqli->commit();			//提交事務
    }

    function close(){
        $this->mysqli->close();				//關閉連接
    }
}

三, php開發細節躺坑

1, 對象之間的弱引用

$a = new Person;
$b = $a;
//改變b, 並不會改變a對象的屬性
//需要使用&
$b = &$a; 進行地址引用

2, php是基於一次請求的腳本, 一次請求執行完畢會釋放本次請求加載的所有資源
3, php編譯後就是c++,
4,如何銷燬一個對象或者屬性

$a = new Person;
unset($a);
//這樣便會銷燬, 但銷燬的只是地址的引用, 內存還並沒有釋放, 且 $a = null

$arr = array("c"=>123);
unset($arr['c'])		//效果是一樣的

5, http 超全局對象

$_POST;		//post請求提交數據,array
$_GET;		//get請求提交數據,array
$_REQUEST;	//請求數據包含get,post , array
$_SESSION;	//session, 請求session
$_COOKIE;	//遊覽器cookie, array

6,文件包含

include "MySql.php";		//包含
include_once("MySql.php");

require "MySql.php";
require_once ("MySql.php");

include函數:會將指定的文件讀入並且執行裏面的程序;
注意: 只有一個文件,是把包含的文件變成了自己代碼的一部分,執行代碼文件大

require函數:會將目標文件的內容讀入,並且把自己本身代換成這些讀入的內容;
注意: 是兩個文件, 他會在引用處去調用被包含的文件裏的代碼,執行代碼文件小

include_once 函數:在腳本執行期間包含並運行指定文件。此行爲和 include 語句類似,唯一區別是如果該文件中已經被包含過,則不會再次包含。如同此語句名字暗示的那樣,只會包含一次;
注意:includeinclude_once 執行報錯只會拋出warning, 程序會繼續執行

require_once 函數:和 require 語句完全相同,唯一區別是 PHP 會檢查該文件是否已經被包含過,如果是則不會再次包含。
注意:requirerequire_once 執行報錯只會拋出error, 程序會終止執行

7,錯誤,異常機制

php 大部分都是錯誤, 像notice, warning, fail, 看起來像是異常, 因爲程序向下執行了,其實全部
都是錯誤。
try{
}catch($Exception $e){
} 
是捕獲不到滴, 想的美!!!

php的異常捕獲, 只能自己程序設計拋出, throw new XXException(), 
是不是很雞肋啊, 樓主是不會用, 也不想用, 自己要是能拋出異常, 我幹嘛要拋出啊
直接處理不好麼??? 哈哈哈

8,程序正常退出

不想讓代碼進行往下運行了
exit(1)

9,在使用插件時, redis時先查看自己有沒有安裝redis插件
php操作redis api, https://www.cnblogs.com/aipiaoborensheng/p/5666005.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章