1. 程式人生 > >Web安全學習_PHP學習_類

Web安全學習_PHP學習_類

一、類

類的定義

<?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

繼承

  1. 用於繼承已定義好的類,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方法
?>
  1. 子類若定義了構造方法則不會呼叫父類的構造方法,若子類沒有定義構造方法則會呼叫父類的構造方法(見上例)
  2. 子類中若需要呼叫父類中的方法,可以通過: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::常量名
    類外訪問常量:類名::常量名