遺留問題:
資源和對象區(qū)別:
我們目前學習到的資源只有兩種:1.$link=mysql_connect("localhost","root","123");得到一個"連接MySQL數(shù)據(jù)庫"的資源。2.$result=mysql_query("select...");結(jié)果集資源,資源變量可以理解為php代碼之外的已經(jīng)有的"對象"。
PHP對象是通過PHP代碼創(chuàng)建出來的。
重載
一個類中,有多個同名方法,每個方法的參數(shù)不同。這種情況叫做重載。參數(shù)不同可以是:數(shù)量個數(shù)、參數(shù)類型、排列順序不同。PHP能夠變相實現(xiàn)重載:
- 屬性重載:使用一個不存在的屬性,會自動調(diào)用類中預(yù)先定義好的某個方法以處理數(shù)據(jù)。
- 方法重載:使用一個不存在的方法,會自動調(diào)用類中預(yù)先定義好的某個方法以處理該行為。
屬性重載
屬性重載使用環(huán)境:
- 取值:$v1 = 對象->屬性;
- 賦值:對象->屬性=XX值;
- 判斷是否存在:isset(對象->屬性)
- 銷毀:unset(對象->屬性)
如果某屬性不存在,但使用以上語法,處理過程: - 取值:自動調(diào)用類中的__get();
- 賦值:自動調(diào)用類中的__set();
- 判斷是否存在:自動調(diào)用類中的__isset();
- 銷毀:自動調(diào)用類中的__unset();
<?php
class A{
public $p1 = 1;
public $propArr = array();//用數(shù)組來存儲"不存在的屬性值"
function __get($prop_name){
if(isset($this->propArr[$prop_name])){
return $this->propArr[$prop_name];
}
return "不存在屬性$prop_name";
}
function __set($prop_name,$value){
$this->propArr[$prop_name] = $value;
}
}
$o2 = new A();
$o2->p2=2;
echo "<br/>o1的p2屬性為:".$o2->p2;
$s1 = isset($o2->p1);
$s2 = isset($o2->p2);
$s3 = isset($o2->p4);
echo "<br/>";
var_dump($s1,$s2,$s3);
unset($o2->p2);
$s4 = isset($o2->p2);
echo "<br/>";
var_dump($s4);
?>
//o1的p2屬性為:2
//bool(true) bool(true) bool(false)
//bool(false)
方法重載
調(diào)用一個類對象中不存在的方法:自動調(diào)用__call()
變相實現(xiàn)了其他變相對象中的重載形式
<?php
function f1(){
echo "<br/>f1函數(shù)被執(zhí)行(任務(wù)完成)";
}
function f2(x,y){
echo "<br/>f1函數(shù)被執(zhí)行(任務(wù)完成)";
return x+y;
}
class A{
function __call($name,$array){
$count = count($array);
if($count==0){
f1();
}else if($count==2){
return f2($array[0],$array[1]);
}
}
}
$o1 = new A();
$o1->f1();
$v1 = $o1->f1(1,2);
echo "<br/>v1結(jié)果=".$v1;
?>
調(diào)用一個類中沒有的靜態(tài)方法:自動調(diào)用__staticCall(),變相實現(xiàn)重載的形式和調(diào)用普通方法類似(利用魔術(shù)方法__get()、set()、__isset()、__unset()等)
接口
接口可以看做是比抽象類更高層面的"規(guī)范",不考慮接口常量的話,功能就是規(guī)范下級類的實現(xiàn)方法,但接口可以實現(xiàn)"多繼承",也就是說一個類可以實現(xiàn)多個接口,而類不能多繼承。所以有接口后,在規(guī)范下級類將變得更加靈活。接口中只有兩類最簡單的特性信息,接口常量、抽象方法
- 接口常量:在接口中的常量
- 抽象方法:需要實現(xiàn)接口的類實現(xiàn)它,無須聲明abstract,但也是抽象方法
<?php
//飛這個動作的接口
interface flyAnimal{
function fly(){
}
}
//鳥類(弗雷)
class bird{
public $wings = "2";
}
//麻雀會飛也是鳥類,繼承父類、實現(xiàn)接口
class maque extends bird implements flyAnimal{
function fly(){
echo "<br/>煽動{$this->wings}個翅膀";
}
}
clase tuoniao extends bird{
public function run(){
echo "<br/>煽動{$this->wings}個翅膀,跑啊跑";
}
}
$m1 = new maque();
$m1->fly();
$t1 = new tuoniao();
$t1->run();
?>
注意:
- 一個類只能集成一個父類,但可以繼承多個接口
class 類名A extends 類名B implements 接口1,接口2...{...}
- 一個接口同樣可以繼承另一個接口(單繼承)
interface 接口1 extends 接口2{···}