如何在PHP类中声明静态变量,但在扩展基类的类中定义它?

3

我有一个DatabaseObject类,其中定义了select、insert、update和delete方法。该类的目的是将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::insert($data);        //INSERT into user table
AnotherClass::insert($data);    //INSERT into another table

...在不实例化任何一个类的情况下。


除非您定义一个不同名称的单独静态方法,例如 insertStatically 或其他名称,否则无法实现。 - Explosion Pills
3
请注意,您完全没有领会“面向对象”编程的精髓,因为您使用了静态类调用和全局变量。《如何避免使用静态方法破坏测试性》(How Not To Kill Your Testability Using Statics):http://kunststube.net/static/ - deceze
1
我认为你复制粘贴的代码中有一个错误,class User extends Object {,我认为应该是:class User extends DatabaseObject {。 - m4t1t0
半离题:这个类中的 global $db; === 不好。同时,或许你应该使用 static 关键字来定义一个静态函数? - Sammitch
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
?>

对于一个静态方法。然而,请注意无法通过这种方式访问静态变量。在PHP.net此处阅读有关本示例和静态关键字的更多信息。
更新:使用self而不是$this->示例。

你在标题中提到了静态变量,在问题中谈论了一个函数/方法/成员,无论你想称之为什么。对于变量,对象必须存在。除非你只想创建一个私有/受保护的变量并创建get/set方法。 - Iron3eagle
也注意到这个问题:“我如何将插入方法定义为静态的,但仍允许它使用在扩展类中定义的表格?”嗯,要定义所述的表格,对象也必须存在...这将使您可以访问该方法。 - Iron3eagle
我认为这并不能解决我的问题。我的问题出现在我尝试在静态方法中访问 $this->table_name 时。我收到一个错误,说我不能在静态方法中使用 $this。所以我尝试将 $table_name 设为静态,但是这样就无法在 User 类中覆盖 $table_name。 - Beau Breedlove
请使用 self::$table_name 而不是 $this->table_name。您不能在静态方法中使用 $this 伪代码。并将变量保留为 static - Iron3eagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接