2011-07-12 34 views
-1

私はすべての典型的なデータベースメソッド(Crudなど)に対してdatabaseObjectというクラスを使用するPHPクラス定義を持っています。私は最近、各テーブルのidカラムがもはや "id"と呼ばれることなく、テーブルが+ idを保持している(例:Companiesテーブルのidが "companyId")ようにデータベース構造を変更しました。そこで、私はdatabaseObjectを拡張するクラスで、そのテーブルのidの名前を保持する$ table_idという静的変数をインクルードします。私は今、そのクラス変数を呼び出す必要がある状況に遭遇しました。コードの例を以下に示します。このコードはPHP 5.3で実行されています。変数を使ってPHPクラス変数を呼び出す

//databaseObject Delete Method; 
public function delete() { 
    global $database; 
    //DELETE FROM table WHERE condition LIMIT 1 
    //escape all values to prevent SQL injection 
    // - use LIMIT 1 
    $sql = "DELETE FROM ".static::$table_name; 
    $sql .= " WHERE ".static::$table_id."=". $database->escape_value($this->id); 
    $sql .= " LIMIT 1"; 
    $database->query($sql); 
    return ($database->affected_rows() ==1) ? true : false; 
} 

//Actual Class that creates the issue 
require_once(LIB_PATH.DS.'database.php'); 
require_once(LIB_PATH.DS.'databaseobject.php'); 

class Contact extends DatabaseObject { 
    protected static $table_name="contacts"; 
    protected static $table_id="contactId"; 
    protected static $db_fields = array('contactId','companyId','contactName', 'phone', 'fax', 'email'); 
    public $contactId; 
    public $companyId; 
    public $contactName; 
    public $phone; 
    public $fax; 
    public $email; 
} 

//Code that calls the method 
$contact = Contact::find_by_id($_GET['contactId']); 
if($contact && $contact->delete()) { 
    $session->message("The Contact was deleted."); 
    log_action('Contact Deleted', "Contact was deleted by User ID {$session->id}"); 
    redirect_to("../companies/viewCompany.php?companyId={$contact->companyId}");  
} else { 
    $session->message("The Contact could not be deleted"); 
    redirect_to('../companies/listCompanies.php'); 

}

+0

自己::についてはどうしますか? – ComFreek

+0

私はそれが問題だとは思わない。彼はすでに静的なメンバーを持っていたので、私は彼がすでにそれらと一緒に作業する方法を知っていると思う。私は今、$ table_idにある名前を持つクラスフィールドにアクセスする方法を尋ねています。それは意味をなさないでしょう。 – AlexanderMP

答えて

3

使用self::$variableないstatic::$variable

+0

なぜですか? http://php.net/manual/en/language.oop5.static.phpのドキュメントを読んで、静的な理由は何ですか::この場合は間違っていますか? – AlexanderMP

-2

あなたが必要なもの、あなたがContract::$table_idでフィールド名にアクセスし、値contractIdを取得Reflection

class Foo { 
    protected $bar = 'barrr!'; 
    private $baz = 'bazzz!'; 
} 

$reflFoo = new ReflectionClass('Foo'); 
$reflBar = $reflFoo->getProperty('bar'); 
$reflBaz = $reflFoo->getProperty('baz'); 

// Set private and protected members accessible for getValue/setValue 
$reflBar->setAccessible(true); 
$reflBaz->setAccessible(true); 

$foo = new Foo(); 
echo $reflBar->getValue($foo); // will output "barrr!" 
echo $reflBaz->getValue($foo); // will output "bazzz!" 

// You can also setValue 
$reflBar->setValue($foo, "new value"); 
echo $reflBar->getValue($foo); // will output "new value" 

です。だから私が正しく理解すれば、$contract->contractIdを得たいと思っていますが、contractIdの名前はこれより前に実行されたコードによって決まります。

これは反射が便利な場所です。

関連する問題