類與對象
php的類與對象這節(jié)叙谨,和其它面向對象語言可謂是基本一樣法严,如果說你學了Java或者C++,理解起來就十分容易欧宜,當然php自己也拓展了許多類的其它功能。我們一起探究下
直接看php類的代碼拴魄,學習它的類基本語法冗茸,我們可以看出席镀,php類的定義還是和Java很像的
class People
{
private $age;
private $name;
//構造函數
public function __construct($age,$name)
{
$this->age = $age;
$this->name = $name;
}
//方法getInfo
public function getInfo()
{
echo "age: ".$this->age." name: ".$this->name.self::num;
echo "<hr>";
}
//析構函數
public function __destruct()
{
// TODO: Implement __destruct() method.
echo "我被釋放了";
}
}
1.創(chuàng)建對象的六大方法
get_class(對象):可以查看這個對象的類名
//father類
class Father
{
//構造函數
public function __construct()
{
}
//類里創(chuàng)建Father對象,返回給外界
public function creatF()
{
return new self();
}
//類里創(chuàng)建Father對象夏漱,返回給外界
public function creatFs()
{
return new static();
}
//析構函數
public function __destruct()
{
// TODO: Implement __destruct() method.
}
}
//Son類繼承Father類
class Son extends Father
{
//Son類定義創(chuàng)建父親對象的方法
public function creatS()
{
return new parent; // TODO: Change the autogenerated stub
}
}
-
通過new直接創(chuàng)建
$f1 = new Father(); echo get_class($f1);//Father
-
通過已經創(chuàng)建的對象間接創(chuàng)建新對象
$f1 = new Father(); $f2 = new $f1(); echo get_class($f2);//Father
-
通過類變量創(chuàng)建對象豪诲,php函數有函數變量,就是變量的值等于函數名挂绰,類變量也是如此屎篱,一個變量的值等于類的名稱,可以用這個變量直接創(chuàng)建對象.
$num = "Father"; $f3 = new $num(); echo get_class($f3);//Father
-
通過類方法self創(chuàng)建對象
//在類里隨便創(chuàng)建個函數葵蒂,函數功能實現返回self創(chuàng)建對象就行 $f1 = new Father(); $f4 = $f1->creatF(); echo get_class($f4);//Father
-
通過類方法static創(chuàng)建對象
//在類里隨便創(chuàng)建個函數芳室,函數功能實現返回static創(chuàng)建的對象 $f1 = new Father(); $f5 = $f1->creatFs(); echo get_class($f5);//Father
-
通過子類的間接創(chuàng)建目標父類對象,返回給外界
$s = new Son; $f6 = $s->creatS(); echo get_class($f6);//Father
總結刹勃,雖然我們列出來6種創(chuàng)建對象的方法,其實最多的還是第一種嚎尤,其它5種也得能看懂荔仁。
2.類常量
類常量就是類里面始終不會變化的變量,用const修飾芽死,且創(chuàng)建時常量前面不用加$符號
且前面不加權限修飾符public/protected/private,常量不可修改
class Test_1
{
const num = 10;
public function getNum()
{
echo Test_1::num;
echo self::num;
}
}
//類常量在類方法里面通過兩種方式訪問
//1 類名::常量
//2 self::常量
//類常量在類外面訪問也是兩種方式
//1 類名::常量
//2 實例對象::常量
$t1 = new Test_1();
$t1->getNum();//10 10
echo $t1::num;//10
echo Test_1::num;//10
3.類文件的自動加載
當我們需要調用其它php文件的類時乏梁,需要引入其它類對應的php文件,這個時候我們需要去找php文件地址关贵,而且代碼會出現大量require/include的字樣遇骑,為了省去引入文件的過程,我們可以通過spl_autoload_register(function)實現自動加載外部類
文件1
//Test1.php
<?php
class Class1{
}
文件2
//Test2.php
<?php
class Class2{
}
文件3
<?php
//聲明這個揖曾,就可以在調用外部類時落萎,自動加載文件,不用寫加載php文件了
spl_autoload_register(
function ($name)
{
include_once $name.".php";
}
);
$t1 = new Class1();//自動加載
$t2 = new Class2();//自動加載
4.對象的封裝
對象通過public/private/protected訪問控制符和get與set方法對類進行完成的封裝炭剪,除此以外练链,php還提供了讓類的外部對象可以直接訪問類里任何變量,甚至可以直接修改類里的變量.
class Father
{
private $age;
//構造函數
public function __construct($age)
{
$this->age = $age;
}
//析構函數
public function __destruct()
{
// TODO: Implement __destruct() method.
}
//設置私有age的值
public function setAge($age)
{
$this->age = $age;
}
//返回私有age值
public function getAge()
{
return $this->age;
}
//可以直接訪問類的全部變量
public function __get($name)
{
return $this->$name;
}
//可以直接修改類的全部變量
public function __set($name, $value)
{
$this->$name = $value;
}
//查詢類是否包含這個屬性
public function __isset($num)
{
return isset($this->$num);
}
//刪除類的某個屬性
public function __unset($num)
{
unset($this->$num);
}
}
//正常過程,沒有寫__get與__set函數前
$f1 = new Father(20);
$f1->age = 21;//error
echo $f1->age;//error
$f1->setAge(21);//通過方法間接修改age
echo $f1->getAge();//21
//通過設置__get奴拦,可以直接訪問原來不可以直接訪問的變量
//通過設置__set媒鼓,可以直接修改原來不可以直接修改的變量
$f1 = new Father(20);
$f1->age = 21;
echo $f1->age;//21
//通過設置__isset(),可以查看類是否存在某個屬性
echo isset($f1->age);//1,存在
//通過設置__unset(),可以刪除類的對應的屬性
unset($this->age);//類的age屬性被刪除
5.類的靜態(tài)屬性和方法
php類的靜態(tài)屬性和方法規(guī)則和Java一樣,用static修飾
- 靜態(tài)屬性和靜態(tài)方法屬于全部類共有的错妖。
- 靜態(tài)方法只可以調用靜態(tài)方法和靜態(tài)屬性
- 靜態(tài)方法和屬性訪問格式 類名::靜態(tài)方法/屬性
class Test
{
//靜態(tài)屬性
public static $num = 10;
public $arr = 20;
//靜態(tài)方法
public static function getNum()
{
echo Test::$num;
}
public static function getArr()
{
echo $this->arr;//error,靜態(tài)方法不可以訪問非靜態(tài)屬性和方法
}
}
echo Test::$num;//10,通過類名直接訪問
Test::getNum();//10,通過類名直接訪問
6.對象的克隆和拷貝
對象變量之間的賦值是引用賦值,指向同一塊內存绿鸣,
對象的克隆是值拷貝,指向兩塊內存暂氯,只是對象的值一樣潮模。
class Test_2
{
private $age;
public function __construct($age)
{
$this->age = $age;
}
public function __get($name)
{
return $this->$name;
}
public function __set($name, $value)
{
$this->$name = $value;
}
}
$t1 = new Test_2(10);
echo $t1->age;//10
$t2 = $t1;
$t2->age = 20;
echo $t1->age." ".$t2->age;//20 20
$t3 = clone $t1;
echo $t1->age." ".$t3->age;//20 20
$t3->age = 30;
echo $t1->age." ".$t3->age;//20 30
7.抽象方法與抽象類
包含抽象方法的類就是抽象類,抽象類不能被構造株旷,只能由子類繼承后實現其全部抽象方法
//抽象類再登,不能創(chuàng)建對象
abstract class F
{
abstract public function eat();
abstract public function sleep();
public function see()
{
echo "i am seeing";
}
}
//繼承抽象類尔邓,實現全部抽象方法
class S extends F
{
public function eat()
{
echo "i am eating";
}
public function sleep()
{
echo "i am sleeping";
}
}
$s1 = new S;
$s1->eat();//i am eatting
8.接口
接口就是一組規(guī)范化的屬性和方法集合體,一個類實現了某接口必須實現對應接口的全部方法
- 接口的屬性必須是常量
- 接口的方法必須是public修飾符
interface face1
{
const num = 100;
public function add();
public function go($num);
}
class S1 implements face1
{
public function add()
{
echo "add";
}
public function go($num)
{
echo $num;
}
}
$s1 = new S1();
$s1->add();//add