PHP實踐之路(八)類與對象(1)

PHP實踐之路(目錄索引)

類與對象(1)

類與對象的知識點較多,我們這裏將分幾篇文章來分別闡述

1、概述

a、類的定義以class爲關鍵字,類名可以是任何非PHP保留字的名字。類的實體內容定義在一對花括號內部,模型如下

class 類名{
    statement...
}

b、僞變量 $this 可以在當一個方法在對象內部調用時使用。$this 是一個到調用對象的引用

c、self在類內部代表類本身

d、創建一個類的實例用new關鍵字

e、PHP當中對象是按引用傳遞的

f、當把一個對象已經創建的實例賦給一個新變量時,新變量會訪問同一個實例,就和用該對象賦值一樣

根據以上知識點,我們做如下實驗

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}	
//定義一個類Person
class Person{
	private $name = "jack";
	static $category="chinese";
	
	public function getName(){
		return $this->name;		//$this爲變量的使用
	}
	
	public function setName($name){
		$this->name=$name;		//這裏如果用$name = $name;的話將不會對成員變量$name有任何的影響
	}
	
	public function getCategory(){
		return self::$category;		//訪問靜態變量,這裏和使用Person::$category是一樣的結果,但在類內部最好使用self,因爲當類名發生變化時,用self就不用改代碼了
	}
}

$p1 = new Person();				//使用new來創建一個對象
println($p1->getName());		//jack

$p2 = $p1;						//對象賦值,$p2訪問的實例將指向$p1指向的對象
println($p2->getName());		//jack

$p3 = &$p1;						//引用賦值,$p3指向$p1
println($p3->getName());		//jack

$p1->setName("lucy");

println($p1->getName());		//lucy
println($p2->getName());		//lucy
println($p3->getName());		//lucy

$p1 = NULL;						//$p1和$p3將都爲null,$p2還指向了剛開始創建的那個對象

var_dump($p1);			//null
var_dump($p2);
/*
object(Person)[1]
  private 'name' => string 'lucy' (length=4)
*/
var_dump($p3);			//null


println($p2->getCategory());	//chinese

//此處雖然按值傳遞,但由於是對象,所以爲引用傳遞
function changeName($obj){
	$obj->setName("lily");	//將改變對象的$name
}

changeName($p2);

println($p2->getName());		//lily

?>

 

2、成員變量

a、類的成員變量也可以叫做類的屬性、字段和特徵等,它表示了一個類數據有的屬性,也就是數據

b、在成員變量的前面添加關鍵字public、protected 或private來達到成員變量的訪問控制。由 public 所定義的類成員可以在任何地方被訪問;由 protected 所定義的類成員則可以被其所在類的子類和父類訪問(當然,該成員所在的類也可以訪問);而由 private 定義的類成員則只能被其所在類訪問

c、爲了兼容php4,php5聲明屬性依然可以直接使用關鍵字var,或者放在public, protected, orprivate之前。但是var並不是必須的。在php 5.0 到5.1.3,var會認爲是廢棄的, 而且拋出E_STRICT警告,但是5.1.3之後就不再認爲是廢棄,也不會拋出警告。 如果直接使用var聲明屬性,而沒有public,protected, 或 private,php 5 會認爲這個屬性爲public

d、在類的成員方法裏面,可以通過$this->property這種方式來訪問類的屬性,但是要訪問類的靜態屬性裏面卻不能使用,而是使用self::$property

e、類成員都必須使用關鍵字public、protected 或 private 進行定義

f、在定義類成員方法時,不添加訪問控制修飾符時默認爲public

 

實驗時間

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}	
//定義一個類Person
class Person{
	static $category = "chinese";	//類別,靜態變量
	private $age = 10;				//年齡,私有變量			
	public $name = "jack";				//年齡,公開變量
	var $work = "";					//工作,用var申明的變量爲public
	
	//內部獲取類別
	public function getCategory(){
		return self::$category;		//此處若用$this->category將報錯
	}
	//內部獲取年齡
	public function getAge(){
		return $this->age;
	}
}

println(Person::$category);		//類外部獲取類的靜態變量,輸出chinese

$p = new Person();				//創建一個對象
println($p->getCategory());		//chinese

println($p->name);				//外部訪問公開變量,輸出jack

//println($p->age);				//外部返給私有變量,報錯Fatal error: Cannot access private property Person::$age

println($p->getAge());			//通過公開方法getAge()來獲取對象的私有屬性age,輸出10
?>


 

3、類常量

a、類常量的值將始終保持不變。在定義和使用常量的時候不需要使用$符號,使用const關鍵字來定義類常量

b、PHP5.3.0之後,我們可以用一個變量來動態調用類。但該變量的值不能爲關鍵字self, parentstatic

實驗一下

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}	
//定義一個類Person
class Person{
	const CLASS_NAME="Person";	//定義一個類常量
	
	function getVal(){
		return self::CLASS_NAME;	//類內部訪問常量,此處也可以用$this::CLASS_NAME
	}
}

println(Person::CLASS_NAME);	//類外部訪問常量,輸出Person
$p = new Person();
println($p::CLASS_NAME);		//使用對象訪問常量,輸出Person

println($p->getVal());		//輸出Person

$val="Person";

println($val::CLASS_NAME);		//變量來動態調用類,輸出Person
?>


 

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