主要内容:
- 建立類
- 成員方法
- 構造方法
- 析構方法
- 封裝
- 繼承
- 接口
- 多态
- 靜态成員
- 常用關鍵字
- 常用魔術方法
從PHP5開始引入了面向對象的全部機制,面向對象的特性符合軟體工程的3個目标:重用性,靈活性,擴充性。
類前面不用public修飾,隻要class,類的屬性不能在初始化指派(除非你寫了構造方法來初始化指派),屬性的使用符号->,比如$aClass->name;
demo.php
<?php
//聲明ren類,預設public,不寫
class ren{
public $name;
public $sex;
public $age;
}
//執行個體化ren類
$xiaoli=new ren();
//設定name屬性
$xiaoli->name="小李";
//擷取name屬性
echo $xiaoli->name;
?>
輸出
=》小李
成員方法
就是類中函數,隻是在原先的函數聲明前面加修飾符public,即可,調用方法$aClass->func(),在函數中使用該對象的屬性使用關鍵字$this,比如$this->name;
class_func.php
<?php
//聲明ren類,預設public,不寫
class ren{
public $name;
public $sex;
public $age;
public function say(){
echo "我叫做".$this->name."<br/>";
}
}
//執行個體化ren類
$xiaoli=new ren();
//設定name屬性
$xiaoli->name="小李";
//調用方法
$xiaoli->say();
?>
我叫做小李
在類的方法中的一個特殊的方法,預設為public(不需要寫),,寫法:__construct(){},注意前面是2個下劃線。
可以使用構造方法進行對象的初始化指派
每一次執行個體化對象(new),都會執行。
construct.php
<?php
//聲明ren類,預設public,不寫
class ren{
public $name;
public $sex;
public $age;
//成員方法
public function say(){
echo "我叫做".$this->name."<br/>";
echo "性别:".$this->sex."<br/>";
echo "年齡:".$this->age."<br/>";
}
//構造方法
function __construct($name,$sex,$age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
}
//執行個體化ren類,初始化對象指派
$xiaoli=new ren("小李","男",25);
//調用方法
$xiaoli->say();
?>
我叫做小李
性别:男
年齡:25
和構造方法名稱類似,但是不能帶任何參數,寫法:function __destruct(){}
在銷毀一個類之前執行一些操作或完成功能,在對象被銷毀時自動執行。
destruct.php
<?php
//聲明ren類,預設public,不寫
class ren{
public $name;
public $sex;
public $age;
//成員方法
public function say(){
echo "我叫做".$this->name."<br/>";
echo "性别:".$this->sex."<br/>";
echo "年齡:".$this->age."<br/>";
}
//構造方法
function __construct($name,$sex,$age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//析構方法
function __destruct(){
echo "<br/>$this->name 這個對象被銷毀了。<br/>";
}
}
//執行個體化ren類,初始化對象指派
$xiaoli=new ren("小李","男",25);
//調用方法
$xiaoli->say();
//對象自動銷毀,執行__destruct
?>
我叫做小李
性别:男
年齡:25
小李 這個對象被銷毀了。
也可以使用unset方法手動銷毀對象,比如$unset($xiaoli)
unset.php
<?php
//聲明ren類,預設public,不寫
class ren{
public $name;
public $sex;
public $age;
//成員方法
public function say(){
echo "我叫做".$this->name."<br/>";
echo "性别:".$this->sex."<br/>";
echo "年齡:".$this->age."<br/>";
}
//構造方法
function __construct($name,$sex,$age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//析構方法
function __destruct(){
echo "<br/>$this->name 這個對象被銷毀了。<br/>";
}
}
//執行個體化ren類,初始化對象指派
$xiaoli=new ren("小李","男",25);
$xiaobai=new ren("小白","女",23);
//調用方法
unset($xiaoli,$xiaobai);
//對象自動銷毀,執行__destruct
?>
小李 這個對象被銷毀了。
小白 這個對象被銷毀了。
面向對象的3特性:封裝,繼承,多态
封裝是面向對象的3特性之一(3特性為:封裝,繼承,多态)
類封裝了代碼,對象則封裝了資料
通路關鍵字:public,private,protected
這也是面向對象的3特性之一
繼承使用的關鍵字為extends
繼承可以拓展原先的類的屬性和方法,還可以直接使用原先的類的屬性和方法,節省了一大推敲代碼的時間!
不過繼承的是public,protected的屬性和方法,至于private乃是師傅的私家珍藏(俗稱“留一手”),是不會讓繼承的!
PHP的面向對象的設計,和Java語言的設計非常的類似,難道是copy“借鑒”了Java的嗎?也許吧!
jicheng.php
<?php
//聲明tool類
class tool{
function on(){
echo "<br/>啟動<br/>";
}
function run(){
echo "運作<br/>";
}
function off(){
echo "關閉<br/>";
}
}
//繼承tool類
class fan extends tool{
function app(){
$this->on();
$this->run();
$this->off();
}
}
$fan=new fan();
$fan->app();
?>
啟動
運作
關閉
PHP5也是單繼承的,隻能extends一個類,但是可以實作(相當于繼承)多個接口(接口相當于是所有方法都是抽象方法,抽象類)
接口的關鍵字interface,實作接口implements
interface.php
<?php
//聲明接口
interface tool{
//全都是預設的public abstract 的方法
function on();
function run();
function off();
}
//實作接口
class fan implements tool{
function on(){
echo "<br/>風扇啟動<br/>";
}
function run(){
echo "風扇運作<br/>";
}
function off(){
echo "風扇關閉<br/>";
}
}
?>
由于PHP是弱類型語言,并不支援完全的多态。
多态就是根據不同的對象來做出不同的反應,運作同一個方法,但是得到的卻是不同的結果。
duotai.php
<?php
//聲明接口
interface tool{
//全都是預設的public abstract 的方法
function on();
function run();
function off();
}
//實作接口
class fan implements tool{
function on(){
echo "<br/>風扇啟動<br/>";
}
function run(){
echo "風扇運作<br/>";
}
function off(){
echo "風扇關閉<br/>";
}
}
//實作接口
class engine implements tool{
function on(){
echo "<br/>發動機啟動<br/>";
}
function run(){
echo "發動機運作<br/>";
}
function off(){
echo "發動機關閉<br/>";
}
}
//狀态類
class toolStatus{
function ts($tool){
$tool->on();
$tool->run();
$tool->off();
}
}
//應用多态
$fan=new fan();
$engine=new engine();
$toolStatus=new toolStatus();
$toolStatus->ts($fan);
$toolStatus->ts($engine);
?>
風扇啟動
風扇運作
風扇關閉
發動機啟動
發動機運作
發動機關閉
類中一種特殊成員,不會被執行個體化到對象中,是以不用執行個體化對象即可調用。
關鍵字static,比如public static $name,public static function say(){};
在類的内部使用靜态的成員使用關鍵字self::$name,self表示類,2個冒号是作用域限定符,$name就是靜态成員。
在程式中使用靜态成員,寫法:
static.php
<?php
//聲明tool類
class tool{
//聲明靜态方法
static function on(){
echo "<br/>啟動<br/>";
}
function run(){
//内部調用靜态方法
self::on();
echo "運作<br/>";
}
function off(){
echo "關閉<br/>";
}
}
//外部調用靜态方法,不用執行個體化對象
tool::on();
$fan=new tool();
$fan->run();
?>
啟動
啟動
運作
常用關鍵字
final,被final(最終的)修飾的類不能被繼承,修飾的屬性不能被修改,比如public final function say(){}
clone,建立一個對象的副本,比如$newClass=clone $aClass;他會自動調用類的__clone(){}方法
常用的魔術方法
function __construct($name,$age){}構造方法
function __destruct(){}析構方法
function __clone(){}拷貝方法
function __set($name,$value)設定方法
function __get($name)擷取方法
function __call($func,$values)
function static __callStatic($func,$values)