前端必會的PHP基礎

php語法

基本語法

數組

//定義數組
$arrayName = array('0' => '🍎','1' => '🍌');
//打印數組
echo $arrayName[0];
複製代碼

請求方面

// 設置utf8的報頭
header( 'Content-Type:text/html;charset=utf-8 ');
// 接受get請求
$username = $_GET['username'];
//post請求
$username = $_POST['username'];
//什麼請求均可以檢測到
$username = $_REQUEST['username'];

複製代碼

連接數據庫

//設置報頭
header("Content-type:text/html;charset=utf-8");
//定義連接的一些參數
$servername = "localhost";
//username默認是root
$username = "root";
$password = "";
//庫名
$dbname = "PHPlesson";
 
// 建立鏈接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 檢測鏈接,若是連接失敗,就拋出錯誤
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
//定義sql語句,添加信息
$sql = "INSERT INTO `news`(`news`, `newsimg`, `addtime`) VALUES ('news11','哈哈','2019-10-11')";

if (mysqli_query($conn, $sql)) {
    echo "新記錄插入成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
//關閉連接
mysqli_close($conn);
複製代碼

PHP的類

class Person{
    //公共屬性
	public $age;
    //公共方法
	public function say($word){
		echo 'she say {$word}';
	}
	public function info(){
        //調用方法,這裏能夠把 ->理解爲js裏面的點
		$this -> say('hi');
		return $this -> age;
	}
}
$xiaohong = new Person();
$xiaohong -> age = 22;
$age = $xiaohong -> info();
echo "123";
echo $age;//22
複製代碼

析構

<?php 
 class person{
    //固定寫法,相似於js裏面的constructor
 	public function __construct($name,$age){
 		//new 的時候自動執行的
 		$this -> name = $name;
 		$this -> age = $age;
 	}
 	public function data(){
 		return $this -> age;
 	}
 	//析構--->代碼執行完畢後指執行的函數
 	public function __destruct(){
 		echo $this -> data();
 		//用途:進行資源的釋放,數據庫的關閉,代碼執行完畢,
 		echo "bye bye {$this -> name}";
 		echo "<hr/>";
 		//bye bye tory
 	}
 }
new person('tory',30); 
new person('red',320); 

 ?>
複製代碼

私有變量,方法,受保護的變量,方法,get和set

<?php 
/* 當試圖獲取一個私有變量時,類會自動調用__get。 一樣的,當試圖設置一個私有變量時,類會自動調用__set。 */
class person{
	//共有的
	public $name = "zjx";
	// 私有的
	private $age = '21';
	//受保護的
	protected $money = '30';
	//私有成員方法不能在類的外部訪問
	private function getName(){
		return $this -> name;
	}
	protected function getMoney(){
		return $this -> money;
	}
	public function userCard(){
		echo $this -> name.$this -> getName().'存款'.$this -> getMoney();
	}
	public function __set($name,$value){
        //$name:變量名,$value:變量值
		//魔術方法的set只針對保護,私有變量
		echo $name.$value.'</br>';
		if ($name == 'age' && $value == '100') {
			echo 'zjx 100';
		}
	}
	public function __get($key){
        //$key:變量名
		echo 'ok'.$key.'ok';
	}
}

$xw = new person();
//沒有set的時候是不能在外邊操做私有變量的
$xw -> age = "100";
echo $xw -> userCard();
echo $xw -> age;
//isset() — 檢測變量是否設置。
unset($name);//幹掉某個變量

 ?>
複製代碼

類的繼承

/*PHP只支持單繼承,不容許多重繼承。一個子類只能有一個父類,不容許一個類直接繼承多個類,但一個類能夠被多個類繼承。 能夠有多層繼承,即一個類能夠繼承某一個類的子類,如類B 繼承了類A,類C又繼承了類B,那麼類C也間接繼承了類A,*/
  class A{
     ....
  }
  class B extends A{
     ....
  }
  class C extends B{
     ....
  }
複製代碼
<?php 

/** * 父類 */
class person {
	public $name = 'zjx';
	private $age = '10';//私有的屬性沒法繼承
	protected $money = '100';//受保護的外部沒法訪問,可是能夠繼承過去
	function __construct($name,$age,$money){
		$this -> name = $name;
		$this -> age = $age;
		$this -> money = $money;
	}
	public function cardinfo(){
		echo $this -> name.'->'.$this -> age.'->'.$this -> money;
	}
}

/** * yellow繼承person */
class yellow extends person {
	
	function __construct($name,$age,$money) {
        //使用父類的構造函數,若是不寫這個的話就會覆蓋父類的構造函數
		parent::__construct($name,$age,$money);
	}
	public function cardinfo($pp){
        //借用父類的cardinfo方法
		parent::cardinfo();
		echo $pp;
	}
}

$s = new yellow('xiaom','1','20');
$s -> cardinfo(11);
 ?>
複製代碼
  1. 在子類中,使用parent訪問父類中的被覆蓋的屬性和方法
  2. 在子類裏面容許重寫(覆蓋)父類的方法
  3. 子類繼承父類的全部內容,但父類中的private部分不能直接訪問
  4. 子類中新增長的屬性和方法是對父類的擴展
  5. 子類中定義的與父類同名的屬性是對父類屬性的覆蓋,同名的方法也是對父類方法的覆蓋

[php接口interface的使用]

接口是什麼?

  • 使用接口(interface),能夠指定某個類必須實現哪些方法,但不須要定義這些方法的具體內容。php

  • 接口是經過 interface 關鍵字來定義的,就像定義一個標準的類同樣,但其中定義全部的方法都是空的。html

  • 接口中定義的全部方法都必須是公有,這是接口的特性。mysql

何時用接口?sql

一、定規範,保持統一性;數據庫

二、多個平級的類須要去實現一樣的方法,只是實現方式不同數組

接口使用規範bash

  • 接口不能實例化
  • 接口的屬性必須是常量
  • 接口的方法必須是public【默認public】,且不能有函數體
  • 類必須實現接口的全部方法
  • 一個類能夠同時實現多個接口,用逗號隔開
  • 接口能夠繼承接口【用的少】

實例:less

<?php

//接口聲明的關鍵字是interface
//接口中的方法都是抽象方法,不也使用abstract去手動的定義
    
interface usb{
    const brand = 'siemens';    // 接口的屬性必須是常量
    public function connect();  // 接口的方法必須是public【默認public】,且不能有函數體
}
// new usb(); // 接口不能實例化

// 類實現接口
class Android implements usb{
    public function connect(){  // 類必須實現接口的全部方法
        echo '實現接口的connect方法';
    }
}


interface usbA{
    public function connect();
}

interface usbB{
    public function contact();
}

// 類能夠同時實現多個接口
class mi implements usbA,usbB{
    public function connect(){

    }
    public function contact(){

    }
}
?>
複製代碼

[php 抽象類abstract]

程序中,有些類的做用只是用來繼承,無須實例化;ide

爲了知足類的這種需求,php提供了抽象類的概念 ,關鍵詞abstract;函數

抽象類原則:

  • 抽象類不能被實例化
  • 有抽象方法的類必定是抽象類;類必需要abstract修飾
  • 抽象方法不能有函數體;即abstract function fun();
  • 抽象類中的非抽象方法,能夠被子類調用
  • 非抽象子類繼承抽象類,子類必須實現父類的全部抽象方法
  • 抽象子類繼承抽象類,無需繼承父類的抽象方法
<?php
abstract class Animal{
    public $name = 'animal';
    // 有抽象方法的類必定是抽象類;類必需要abstract修飾
    // 抽象方法不能有函數體
    abstract function cry();
    public function getName(){
        echo '個人名字';
    }
}
// new Animal(); // 報錯,抽象類不能被實例化

class Dog extends Animal {
    // 非抽象子類繼承抽象類,子類必須實現父類的全部抽象方法
    public function cry(){

    }
}

$dog = new Dog();
$dog->getName();    //抽象類中的非抽象方法能夠調用

abstract class Cat extends Animal{
    // 抽象子類繼承抽象類,無需繼承父類的抽象方法
}
?>
複製代碼

[php require、require_once和include、include_once的區別]

1、引入php文件路徑的方法
require '文件路徑';  require ('文件路徑');
require_once '文件路徑';  require_once ('文件路徑');

include 同 require
include_once 同 require_once 
 
2、include和require的區別
複製代碼
  • 相同點:都是引入文件
  • 不一樣點:require遇到錯誤終止程序;include遇到錯誤繼續執行。

推薦使用require_once方法引入文件

[php 面向對象三大特色:封裝、繼承、多態]

在講解這三大特性前,咱們先講訪問修飾符。

php中有3中訪問修飾符:public protected private;

public:表示公有的;可在本類、子類、對象實例中訪問。

protected:表示受保護的;可在本類、子類中訪問;不能在對象實例中訪問。

private:表示私有的;可在本類中訪問;不能在子類、對象實例中訪問。

1、封裝性

封裝就是把抽取出來的數據和對數據的操做封裝在一塊兒,數據被保護在內部,程序的其餘部分只有被受權的操做(方法)才能對數據進行操做。

class Student{
    public $name;
    protected $age;
    private $play;
    public function __construct($name, $age){
        echo '我是Student類';
        $this->name = $name;
        $this->age = $age;
    }
}

$student = new Student('moon', 18);
複製代碼

2、繼承性

當多個類有不少共同屬性和方法時,代碼冗餘;這時,咱們能夠將共有部分提取出來,封裝成一個類;子類通過一些操做可使用這個共有的父類,這個就叫繼承。

語法結構:

class 父類名{}

class 子類名 extends 父類名{}

繼承要素:

  • 一個子類只能繼承一個父類(這裏指直接繼承);若是但願繼承多個類的屬性和方法,可使用多層繼承
  • 在子類中調用父類的構造方法 父類::__construct() 或者 parent::__construct()
  • 若是子類和父類的方法名相同(public,protected),咱們稱爲方法覆蓋或方法重寫(override),看下面的多態性
class Student{
    public $name;
    protected $age;
    private $play;
    public function __construct($name, $age){
        echo '我是Student類';
        $this->name = $name;
        $this->age = $age;
    }
}

// Pupil類繼承Student類
class Pupil extends Student {
    public function testing(){
        echo '我是Pupil';
    }
    public function __construct($name, $age){
        parent::__construct($name, $age);   // 調用父類的構造方法1
        // Student::__construct($name, $age); // 調用父類的構造方法2
        echo $this->name;
        echo $this->age;
        // echo $this->play; // 報錯,父類private定義的屬性不能被子類繼承
    }
}

new Pupil('sky', 18);


// 實現類的多層繼承
class A{
    public $name='AAA';
}
class B extends A{
    public $age=30;
}
class C extends B{}
$p = new C();
echo $p->name; // 這裏會輸出AAA 
複製代碼

3、多態性

  • 子類覆蓋父類的方法(重寫),必需要求父類、子類的方法名和參數個數徹底一致
  • 子類調用父類的方法(protected/public),使用 父類名::方法名 或者 parent::方法名
  • 在實現方法重寫的時候,訪問修飾符能夠不同,可是子類方法的訪問權限必須大於等於父類方法的訪問權限
class Student{
    public $name;
    protected $age;
    private $play;
    public function getPlay(){
        echo '我是Student';
    }
}

// Pupil類繼承Student類
class Pupil extends Student {
    public function __construct(){
        parent::getPlay(); // 能夠這樣調用父類的方法
    }

    public function getPlay(){
        echo '我是Pupil';
    }
}

$p1 = new Pupil();  // 我是Student
$p1->getPlay();     // 我是Pupil 
複製代碼

擴展:

方法重載(overload)

基本概念:函數名相同,但參數的個數或參數的類型不一樣,達到調用同一個函數,能夠區分不一樣的函數

在PHP5中雖然也支持重載,可是和其它語言仍是有很大區別的,php中不能定義多個同名函數

PHP5中提供了強大的「魔術」函數,使用這些魔術函數,咱們能夠作到函數重載

這裏咱們要到到 __call,當一個對象調一個方法時,而該方法不存在,則程序會自動調用__call

相關文章
相關標籤/搜索