簡體   English   中英

從父抽象類調用抽象方法

[英]Calling an Abstract method from parent abstract class

看完這個問題后 ,我自己嘗試了所選擇的答案! 基本上我寫的是`

abstract class person
{

  function __construct()
  {
    // some code here
  }

  function myfunc()
  {
    $this->test();
  }

  abstract function test();
}

class employee extends person
{
  function __construct()
  {
    parent::__construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}


$employee = new employee();
$employee->myfunc();`

當我運行這個腳本時,我得到了一個常見錯誤致命錯誤:當不在第7行的對象上下文中時使用$ this。

那么,我如何從父類調用抽象?

  • 編輯

我想要做的真正的事情是創建一個DatabaseObject類,它包含不同數據庫對象的所有常用方法,並使類擴展它。

abstract class DatabaseObject {
   abstract protected function getTableName();

   public static function find_by_id($id = 0){
        global $database;
        $class = get_called_class();

        $result_array = self::find_by_sql("SELECT * FROM ". $this->getTableName() ." WHERE _id = {$id} LIMIT 1");
        echo $result_array . "<br />";
        return !empty($result_array) ? array_shift($result_array) : false;
    }

    public static function find_by_sql($sql=""){
        global $database;
        $result_set = $database->query($sql);
        $object_array = array();
        while ($row = $database->fetch_array($result_set)){
            $object_array[] = self::instantiate($row);
        }
        return $object_array;
    }
   }
}

所以這是我的DatabaseObject類的一部分。 我的用戶類如下

class User extends DatabaseObject {
    protected static $table_name = "users";

    protected function getTableName(){
        global $table_name;
        return $table_name;
    }
}

現在,每當我這樣做

$user = new User();
$user->findById(1);

我得到錯誤致命錯誤:當不在指向的行的對象上下文中時使用$ this

$this->getTableName();

我希望這可能有助於清理一些東西。 有什么辦法可以實現嗎? 謝謝!

你的代碼示例工作得很好,我不明白你的問題Demo

因此,您共享的代碼不是您與錯誤所討論的代碼。

您不能將變量稱為類的成員,因為您將其聲明為靜態變量。 調用靜態變量看起來與調用靜態函數時相同,使用::運算符。

class User extends DatabaseObject {
    protected static $table_name = "users";

    protected function getTableName(){
        return self::$table_name;
    }
}

您無法訪問同一抽象類中的抽象函數。

你需要什么,你必須只在子類中調用該方法,抽象超類不會調用子類函數。

編輯:

因為函數dosent存在於該類中。

第一件事是你不能在同一個類中調用抽象函數。 你正在調用test(); 在myfunc()中,oops不允許這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM