2

この質問を見た後、私は自分で選んだ答えを試しました!だから基本的に私が書いたのは`

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();

これがいくつかのものを片付けるのに役立つことを願っています。これを達成する方法はありますか?ありがとう!

4

4 に答える 4

1

静的に宣言したため、クラスのメンバーであるかのように変数を呼び出すことはできません。静的変数の呼び出しは、静的関数を呼び出す場合と同じように見えます。::演算子を使用してください。

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

    protected function getTableName(){
        return self::$table_name;
    }
}
于 2012-05-05T12:48:22.900 に答える
1

コード例は問題なく動作します。問題Demoがわかりません。

したがって、共有したコードは、エラーで話しているコードではありません。

于 2012-05-05T12:43:33.263 に答える
0

同じ抽象クラス内の抽象関数にアクセスすることはできません。

ニーズが何であれ、サブクラスでのみそのメソッドを呼び出す必要があります。抽象スーパークラスはサブクラス関数を呼び出しません。

編集:

関数dosentがそのクラスに存在するためです。

于 2012-05-05T12:15:26.473 に答える
0

まず、同じクラス内で抽象関数を呼び出すことはできません。test(); を呼び出しています。おっとによって許可されていないサイド myfunc() で。

于 2012-05-05T12:21:22.990 に答える