方法重載
函數名不一樣通過函數的參數個數或者參數類型不同,達到調用同一個函數名,但是可以區分不同的函數
class A{
public function test1(){
echo "test1";}
public function test1($a){
echo "test1 hhh";}
}
重載
$a=newA();
$a->test1();
$a->test1(222);
上面的這種用法是不對的
魔術函數 方法重載實現
class A{
public function test1($p){
echo "接受一個參數";}
public function test1($p){
echo "接受二個參數";}
}
提供一個__call
__call是它一個對象調用某個方法,而該方法不存在,則系統會自動調用__call
function __call($method,$p){
var_dump($p);
if($method=="test1"){
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
$a=newA();
$a->test(1);
$a->test(1,2);
魔術函數
__set,__get,__construct,__destruct,__call,__isset,__unset
__LINE__輸出多少行
,__FILE__輸出文件名
,__DIR__,
__CLASS__輸出類名
方法重寫/方法覆蓋(overload)
<?php
class Animal{
public $name;
protected $price;
function cry(){
echo "不知道";}
}
class Dog extends Animal{
//覆蓋
function cry(){
echo "小狗";}
}
class Pig extends Animal{
//覆蓋
function cry(){
echo "小豬";}
}
$dog1=new Dog();
$dog1->cry();
$pig=1new Pig();
$pig1->cry();
?>
關於重寫:
當一個父類知道所有的子類都有一個方法但是父類不能確定該方法究竟如何寫,可以讓子類去覆蓋這個方法
1.要實現重寫,要求子類的那個方法的名字和參數列表一模一樣,但是並不要求參數名稱一樣
2.如果子類要求調用父類的某個方法(public/protected)則可以使用parent::方法名(參數...),父類名::方法名(參數...)
3.在實現方法覆蓋的時候,訪問修飾符可不一樣,但是必須滿足子類的訪問范圍>=父類的訪問范圍
多態體現在什麼地方
當子類沒用覆蓋父類的方法則$call->cry()調用的是父類,子類覆蓋父類的方法則調用自己的cry( )