PHP中,在一個類的定義中,我們可以使用extends關鍵字來繼承另一個類。這就意味著,在一個類中,我們可以使用另一個類中定義的屬性和方法。這個繼承關系可以呈現出類似于家族樹的形狀,這也是OOP中面向對象思想的一個體現。本文將介紹PHP中extends規則的具體內容。
一個簡單的例子:
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function eat() {
echo $this->name . ' is eating...';
}
}
class Dog extends Animal {
public function bark() {
echo $this->name . ' is barking...';
}
}
$dog = new Dog('Tom');
$dog->bark();
$dog->eat();
在這段代碼中,我們定義了一個Animal類和一個Dog類。其中,Dog類繼承了Animal類。這意味著在Dog類中我們可以使用Animal類中定義的屬性和方法。在這個例子中,我們使用Dog類的實例$dog分別調用了bark()和eat()方法。由于Dog類繼承了Animal類,$dog實例可以訪問Animal類中定義的方法eat()。
一個類只能繼承自另外一個類,也就是說,extends關鍵字后面只能跟一個類名。PHP不支持多重繼承。如果我們嘗試這樣做,PHP將會拋出一個Fatal Error異常。例如:class A {
public function a() {
echo 'a';
}
}
class B extends A {
public function a() {
echo 'b';
}
}
class C extends A,B {
}
$c = new C();
$c->a();
這段代碼就會拋出一個Fatal Error異常,因為C繼承了兩個類。正確的做法是,像下面這樣通過組合而非繼承來達到多重繼承的目的:class A {
public function a() {
echo 'a';
}
}
class B {
public function b() {
echo 'b';
}
}
class C {
private $a;
private $b;
public function __construct( A $a, B $b ) {
$this->a = $a;
$this->b = $b;
}
public function a() {
return $this->a->a();
}
public function b() {
return $this->b->b();
}
}
$a = new A();
$b = new B();
$c = new C($a, $b);
$c->a();
$c->b();
這里我們定義了C類,并使用了A和B類的實例作為它的屬性。最后我們創建了C類的實例并使用它來調用A類和B類中的方法。
extends關鍵字不僅能夠讓子類繼承父類的所有屬性和方法,同時還允許子類重寫父類的方法。這就是所謂的方法覆蓋。例如:class Animal {
public function move() {
echo 'Animal is moving...';
}
}
class Dog extends Animal {
public function move() {
echo 'Dog is moving...';
}
}
$dog = new Dog();
$dog->move();
在這個例子中,我們定義了兩個類Animal和Dog。由于Dog類繼承了Animal類,因此它可以訪問Animal類中定義的屬性和方法。這里我們把Animal類中的move()方法在Dog類中重寫了一次。當我們調用$dog->move()時,執行的是Dog類中的move()方法,而不是Animal類中的move()方法。
extends關鍵字在PHP中是一個非常有用的特性。它可以讓我們的代碼更加簡潔靈活,并且提高代碼的復用率。當你開始使用OOP編程思路時,extends關鍵字是一個非常重要的概念,它會讓你的代碼更加清晰易懂。