2017-05-27 152 views
2

我作爲一個抽象的數據庫類名爲:PHP:致命錯誤:無法實例化抽象類

abstract class database { 
    protected $value; 
} 

我創造了另一個抽象類

abstract class my_database extends database { 
    public function set_value($value) { 
    $this->value = $value; 
    } 
} 

當我嘗試使用它:

$my_db = new my_database(); 

我得到的錯誤:

Fatal error: Cannot instantiate abstract class my_database in ... 

我所要做的是:抽象類數據庫有一個受保護的$值,我想創建一個包裝類,以便能夠更改受保護的值(臨時)。

我該怎麼做?

EDIT1:不幸的是更早的時候,我嘗試沒有抽象MY_DATABASE,我得到了錯誤:

- abstract methods and must therefore be declared abstract or implemented 
- Abstract function cannot contain body 

EDIT2: 從MY_DATABASE取出抽象的詞完全後,我得到了以下錯誤:

Fatal error: Class my_database contains 32 abstract methods and must therefore be declared abstract or implement the remaining methods

我該如何解決這個問題?

+2

你不能調用'new(abstract class)'。在這個用例中,'my_database'不應該是抽象的。 – rickdenhaan

+0

定義爲抽象的類可能不會被實例化http://php.net/manual/en/language.oop5.abstract.php –

+0

抽象類不能被實例化,但它們可以被分類。 –

回答

8

定義爲抽象的類可能不會被實例化,並且任何包含至少一個抽象方法的類也必須是抽象的。你可以在這裏閱讀PHP的文檔:link

下面是一個例子。

有一個抽象類(注意,抽象方法沒有身體 - 他們不能有身體 - 它只是一個簽名):

abstract class AbstractClass 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 

    // Common method. It will be available for all children - they don't have to declare it again. 
    public function printOut() { 
     print $this->getValue() . "\n"; 
    } 
} 

與像類擴展您的抽象類這個(注意,所有抽象方法必須在具體的類定義):

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 

然後你就可以ConcreteClass1的創建實例:

$class1 = new ConcreteClass1; 
+1

@klor再次閱讀我的答案 - 「任何包含至少一個抽象方法的類都必須是抽象的」 - 如果你的類有一個抽象方法,然後讓你的類抽象並通過具體類來擴展它,如我的anwer中所示。 – arbogastes

+0

解決方案後,我得到以下錯誤:致命錯誤:類my_database包含32個抽象方法,因此必須聲明爲抽象或實現其餘方法 – klor

+0

@klor因此,您的類my_database擴展了一些具有32個抽象方法的抽象類。在你的my_database中,你必須實現這些方法中的每一個。 – arbogastes

0

您的類不應該是抽象的:

class my_database extends database { 
    public function set_value($value) { 
    $this->value = $value; 
    } 
} 

在OOP中,抽象類不能被實例化探微它可以延長。

+0

編輯我的帖子。 – klor

相關問題