Web安全學習_PHP學習_類
阿新 • • 發佈:2018-11-23
一、類
類的定義:
<?php
class 類名{
var $變數名; //成員變數通過var定義,也可初始化
function 函式名(引數列表){
函式體
}
$this->變數名; //$this表示自身的物件
}
//建立類並呼叫類成員及方法
$物件名=new 類名;
$物件名->成員變數名=值; //呼叫成員變數並賦值
$物件名->方法名(); //呼叫成員方法
?>
建構函式:用於對成員變數進行初始化
<?php class Person{ var $name; var $height; //定義建構函式,函式名為__construct,括號裡面為引數列表,這裡定義了兩個引數,在定義物件時需要傳入引數 function __construct($a,$b){ $this->name=$a; $this->height=$b; } } $Bob=new Person("Bob",180); //定義了一個Bob物件並傳入Bob和180的引數 echo $Bob->name; //此時輸出名字"Bob" echo $Bob->height; //輸出身高為180 ?>
解構函式:用於物件呼叫完函式後,釋放空間。函式名為__destruct
繼承:
- 用於繼承已定義好的類,PHP不支援多繼承。使用關鍵字
extends
只能繼承父類的public、protected成員變數和方法,private成員變數和方法不能繼承。
<?php //定義一個父類 class People{ //定義三種訪問許可權的成員變數 public $name="public name"; protected $age="protected age"; private $salary="private salary"; //定義一個公有訪問許可權方法 public function showName(){ echo "父類public"; } //定義一個保護許可權的方法 protected function showAge(){ echo "父類protected"; } //定義一個私有訪問許可權的方法 private function showSalary(){ echo "父類private"; } //定義符類的建構函式 function __construct(){ echo "父類建構函式"; } } //建立一個子類繼承父類 class Coder extends People{ //定義子類的建構函式 function __construct(){ echo "子類建構函式"; } function showprotected(){ echo $this->age; } function showprivate(){ echo $this->salary; } function showprotectedhanshu(){ $this->showAge(); } function showprivatehanshu(){ $this->showSalary(); } } //建立一個子類的物件 $Bob=new Coder(); echo $Bob->name;//成功輸出說明繼承了父類的public成員屬性 //通過子類的輸出protected變數方法測試是否繼承父類的protected成員屬性 echo $Bob->showprotected(); //成功輸出,說明繼承了protected成員屬性 echo $Bob->showprivate();//報錯,說明未繼承父類的private屬性 //---------測試繼承父類的方法---------- echo $Bob->showName();//成功輸出說明繼承了父類的public方法 echo $Bob->showprotectedhanshu();//成功輸出說明繼承了父類的protected方法 echo $Bob->showprivatehanshu();//報錯,說明未繼承父類private方法 ?>
- 子類若定義了構造方法則不會呼叫父類的構造方法,若子類沒有定義構造方法則會呼叫父類的構造方法(見上例)
- 子類中若需要呼叫父類中的方法,可以通過:parent::方法名();或父類名::方法名();呼叫。
方法重寫:當繼承以後可以對父類的方法進行重寫,此時將覆蓋之前的內容。子類重寫時,訪問許可權不能小於父類方法的訪問許可權。如父類為public,子類不能為protected
<?php //先定義一個Person類 class Person{ var $name; var $height; function print_name(){ echo $this->name; } } //定義Person2類,繼承Person類 class Person2 extends Person{ var $weight; var $hobby; //對父類的方法進行重寫 function print_name(){ echo $this->weight; } } //建立一個Person2類的物件 $Alice=new Person2; $Alice->name="Alice"; $Alice->weight="65kg"; echo $Alice->name; echo $Alice->weight; $Alice->print_name(); //此時僅會輸出weight ?>
類的成員變數的三種訪問許可權:
- public(公有):可以在任何地方訪問。 使用
var
關鍵字定義的變數為公有訪問屬性 - protected(保護):可以被其自身、其父類、其子類訪問。
- private(私有):只能被其定義的所在類訪問
訪問private和protected成員需要通過類內public函式訪問
<?php
class A{
private $n1; //定義私有成員n1
private $n2; //定義私有成員n2
function setN1($N1,$N2){
$this->n1=$N1; //通過公有方法對n1和n2賦值
$this->n2=$N2;
}
function showInfo(){
echo $this->n1; //輸出n1和n2的值
echo $this->n2;
}
}
$Bob=new A();
//若加入此程式碼會報錯$Bob->n1=100;
//Cannot access private property
$Bob->setN1(10,20);
$Bob->showInfo();
?>
static變數
靜態變數與全域性變數原理相似,但靜態變數只能通過類來訪問,全域性變數破壞了封裝性
定義:
<?php
class People{
//許可權 static $變數名;
public static $num=0;
function addPeople(){
//※※類內訪問:self::$變數名或類名::$變數名
//※※類外訪問:類名::$變數名
self::$num+=1;
}
}
$Bob=new People; //建立一個物件Bob
$Bob->addPeople();
$Alice=new People; //增加一個物件Alice
$Alice->addPeople();
echo People::$num; //類外訪問靜態變數,訪問靜態變數的值
?>
**靜態方法(類方法)**只能操作靜態變數,不能操作非靜態變數
普通的方法可以操作靜態變數也可以操作非靜態變數
定義
<?php
class People{
public static $num=0; //定義一個靜態變數
public static function addPeople(){
People::$num+=1; //靜態方法操作靜態變數
}
}
?>
final關鍵字
如果一個類被宣告為final類則此類不能被繼承,若一個類中的成員方法被宣告final則此類不能被重寫,但可以被繼承,不能修飾成員屬性。
<?php
//定義父類People1,其中的print_Age()方法被宣告為final
class People1{
public $name;
public $age;
function print_Name(){
echo $this->name;
}
final function print_Age(){
echo $this->age;
}
}
//定義子類People2繼承父類People1,此時不能對父類中的print_Age方法進行重寫,如重寫則報錯
class People2 extends People1{
public $height;
function print_height(){
echo $this->height;
}
}
$Bob=new People2;
$Bob->age=19;
$Bob->name="Bob";
$Bob->height=187;
$Bob->print_Name();
$Bob->print_Age();
$Bob->print_height();
?>
抽象類
- 將一箇中的方法不進行例項化,供其他類繼承。
- 只要類中有一個為抽象方法則此類就必須宣告為抽象類
- 抽象類被繼承後,子類中必須實現抽象類中的所有抽象方法
介面
- 介面不能例項化 一個類可以實現多個介面用逗號隔開
- 介面只宣告方法不實現 類實現某個介面必須將介面內的方法全部實現
- 介面中不能定義變數,可以定義常量 一個
- 介面可以繼承多個介面,逗號隔開
const常量
- 定義時必須賦初值。
- 常量名為大寫。
- 常量一旦定義就不能修改。
- 常量具有public的屬性但不能在定義常量之前加訪問許可權的關鍵字。
- 可以被子類繼承。
類內訪問常量:類名::常量名 或 self::常量名
類外訪問常量:類名::常量名