3

select、insert、update、およびdeleteメソッドが定義されたDatabaseObjectクラスがあります。このクラスの目的は、MySQL データベース内の行のサブセットを PHP オブジェクトとして表すことです。コンストラクタは MySQL の SELECT コマンドを呼び出し、デストラクタは DELETE コマンドを呼び出します (要求しない限り)。

ここに私の DatabaseObject クラスがあります:

class DatabaseObject {  
    protected $table;
    protected $index_field;

    private $data;

    function __construct($id) {
        //MySQL SELECT and assign resource to data
    }

    function __destruct() {
        //MySQL UPDATE
    }

    public function insert($data) {
        global $db;     //Database Class for using MySQL

        $fields = array();
        $values = array();

        foreach ($data as $field => $value) {
            $fields[] = "`".$field."`";
            $values[] = "'".$db->escape($value)."'";
        }

        $sql = "INSERT INTO ".$this->table." (".join(', ', $fields).") VALUES (".join(', ', $values).")";
        if($db->query($sql)) {
            return $db->insertID();
        } else {
            return false;
        }
    }

    //More methods; update(), delete(), select()
}

特定のテーブルにアクセスする場合は、DatabaseObject クラスを拡張します。たとえば、私の User クラスは私のユーザー テーブル用です。ここにあります:

class User extends Object {
    public static $anonymous_data = array('user_id' => 0, 'user_level' => ANONYMOUS, 'username' => 'Anonymous');

    function __construct($user_id = NULL) {
        global $db;
        $this->db = $db;

        $this->table = USER_TABLE;
        $this->index_field = 'user_id';

        parent::__construct($user_id);
    }

    function __destruct() {
        parent::__destruct();
    }

    //Other user methods; login(), logout() etc.
}

ここで、User クラスをインスタンス化しなくても、ユーザー クラスから挿入メソッドを呼び出せるようにしたいと考えています。そうするためには静的にする必要があると確信しています。挿入メソッドを静的にするにはどうすればよいですか? ただし、拡張クラスで定義されたテーブルを使用できるようにするにはどうすればよいですか?

言い換えれば、私はこれを行うことができるようにしたい:

User::insert($data);        //INSERT into user table
AnotherClass::insert($data);    //INSERT into another table

...どちらのクラスもインスタンス化せずに。

4

1 に答える 1

0
<?php
class Foo {
    public static $anonymous_data = array();

    public static function aStaticMethod() {
        self::$anonymous_data = array(key, value);

        foreach (self::$anonymous_data as $key => $value) {
             echo "$key => $value";
        }
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>

静的メソッドの場合。ただし、この方法では静的変数にアクセスできないことに注意してください。この例と static キーワードについて詳しくは、PHP.netをご覧ください。

更新:例selfの代わりに使用$this->

于 2012-11-14T17:24:45.093 に答える