【问题标题】:How do I declare a static variable in a PHP class but define it in a class which extends the base class?如何在 PHP 类中声明静态变量,但在扩展基类的类中定义它?
【发布时间】:2012-11-03 05:48:06
【问题描述】:

我有一个定义了选择、插入、更新和删除方法的 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::insert($data);        //INSERT into user table
AnotherClass::insert($data);    //INSERT into another table

...不实例化任何一个类。

【问题讨论】:

  • 你不能,除非你用不同的名字定义一个单独的静态方法,比如insertStatically或其他东西。
  • 让我指出,您完全错过了使用静态类调用和globals 进行面向对象编程的要点。 How Not To Kill Your Testability Using Statics
  • 我认为你粘贴的代码有错误,class User extends Object {,我认为应该是:class User extends DatabaseObject {
  • 半题外话:这个 global $db; 在 class=== 里面不好。另外,也许你应该使用static 关键字来定义一个静态函数?

标签: php mysql static extend


【解决方案1】:
<?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-&gt; 示例。

【讨论】:

  • 您在标题中还提到了静态变量,在您的问题中,您谈到了一个函数/方法/成员,无论您想怎么称呼它。对于变量,对象必须存在。除非您只想创建一个私有/受保护的变量并创建 get/set 方法。
  • 也注意到这一点,“如何使插入方法静态,但仍允许它使用扩展类中定义的表?”好吧,要定义所述表,对象也必须存在......这将使您可以访问该方法。
  • 我认为这不能解决我的问题。当我尝试在静态方法中访问 $this->table_name 时出现了我的问题。我收到一条错误消息,提示我无法在静态方法中使用 $this。所以我尝试将 $table_name 设为静态,但它不允许我在 User 类中覆盖 $table_name。
  • 使用self::$table_name 而不是$this-&gt;table_name。您不能在静态方法中使用 $this 伪代码。并将变量保留为static
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2019-10-15
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多