Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP类中声明静态变量,但在扩展基类的类中定义它?_Php_Mysql_Static_Extend - Fatal编程技术网

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

如何在PHP类中声明静态变量,但在扩展基类的类中定义它?,php,mysql,static,extend,Php,Mysql,Static,Extend,我有一个DatabaseObject类,它定义了select、insert、update和delete方法。该类的目的是将MySQL数据库中的行子集表示为PHP对象。构造函数调用MySQL的SELECT命令,析构函数调用DELETE命令(除非我要求它不要这样做) 以下是我的DatabaseObject类: class DatabaseObject { protected $table; protected $index_field; private $data;

我有一个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类。例如,我的用户类用于我的用户表。这是:

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.
}
现在,我希望能够在没有实例化用户类的情况下从用户类调用insert方法。我很确定,我必须让它保持静止才能这样做。如何使insert方法成为静态的,但仍然允许它使用扩展类中定义的表

换句话说,我希望能够做到这一点:

User::insert($data);        //INSERT into user table
AnotherClass::insert($data);    //INSERT into another table
…而不实例化任何一个类。


<?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
?>
对于静态方法。但是,请注意,静态变量不能通过这种方式访问。阅读有关此示例和静态关键字的更多信息:


更新:使用
self
而不是
$this->
示例。

你不能,除非你定义了一个单独的静态方法,使用不同的名称,比如
insertstatic
或其他什么。让我指出,使用静态类调用和
globals
,你完全没有面向对象编程的意义。我认为您粘贴的代码中有一个错误,class User extends Object{,我认为应该是:class User extends DatabaseObject{Semi-off-topic:This
global$db;
在一个类中===bad。另外,也许你应该使用
static
关键字来定义一个静态函数?另外你在标题中提到了静态变量,在你的问题中你谈到了一个函数/方法/成员,你想怎么称呼它。对于变量,对象必须存在。除非你的只想创建一个私有/受保护的变量和get/set方法。还注意到,“如何使insert方法成为静态的,但仍然允许它使用扩展类中定义的表?”好的,要定义所说的表,对象也必须存在……这将使您能够访问该方法。我认为这并不能解决我的问题。我的问题出现在我尝试在静态方法中访问$this->table\u name时。我得到一个错误,说我不能在静态方法中使用$this。因此我尝试将$table\u name设置为静态,但它不能全部使用如何在用户类中重写$table\u name。请使用
self::$table\u name
而不是
$this->table\u name
。您不能在静态方法中使用
$this
伪代码。并将变量保留为
static