17
class database{
    protected $db;

    protected function connect(){
        $this->db = new mysqli( /* DB info */ ); // Connecting to a database
    }
}

class example extends database{
    public function __construct(){
        $this->connect();
    }

    public static function doQuery(){
        $query = $this->db->query("theQuery");   // Not working.
        $query = self::$db->query("theQuery");   // Not working.
        $query = parent::$db->query("theQuery"); // Also not working.
    }
}

そのようなことをしたいのですが、機能する方法が見つかりません。プロパティは静的でなければなりません...

4

7 に答える 7

22

新しいオブジェクト ( ) をインスタンス化することでアクセスできます$self = new static;。サンプルコード:

class Database{

    protected $db;

    protected function connect(){
        $this->db = new mysqli( /* DB info */ ); // Connecting to a database
    }
}


class Example extends Database{

    public function __construct(){
        $this->connect();
    }

    public static function doQuery(){

        $self = new static; //OBJECT INSTANTIATION
        $query = $self->db->query("theQuery");   // working.

    }
}

これは呼び出しと同じです $self = new Example;が、よりプログラム的に、クラス名が変更された場合でも更新する必要はありません。

于 2016-10-15T05:08:51.273 に答える
9

静的メソッドから非静的プロパティにアクセスすることはできません。非静的プロパティはインスタンス化されたオブジェクトにのみ属し、インスタンス化されたすべてのオブジェクトには個別のプロパティ値があります。

例を示しますが、このコードは機能しません:

class Example {
    public $a;

    public function __construct($a) {
        $this->a = $a;
    }
    public static function getA() {
        return $this->a;
    }
}

$first = new Example(3);
$second = new Example(4);

// is $value equal to 3 or 4?
$value = Example::getA();
于 2013-02-27T17:33:36.890 に答える
1

オブジェクトを作成するときにオブジェクトの仕様を決定するのが最善ですが、オブジェクトの仕様が選択したパターンと一致していないように思えます。

通常、「オブジェクト (静的) のインスタンスが 1 つだけ必要なのか、それとも複数必要なのか?」と自問する必要があります。

この特定のインスタンス (データベースに接続してクエリを実行する) では、データベースへの複数の接続を確立する必要がない限り、データベース オブジェクトのインスタンス化されたオブジェクトを持つことはお勧めできません。

したがって、インスタンス化されたオブジェクトと静的オブジェクトのユースケースがあります。構成と、1 回の実行で接続が作成される回数によっては、複数の同時接続によってデータベースが過負荷になる可能性があります。

そのことを念頭に置いて、オブジェクトのアーキテクチャを支援するために利用できる PHP 用の OOP 設計「パターン」がいくつかあります。より一般的なパターンの詳細については、 http://www.slideshare.net/RobertGonzalez/object-directional-design-patterns-for-php-presentationを参照してください。

実際の例についてはhttp://ideone.com/6qxvqx

mysqliの名前を mysqli2 に変更し、クエリを処理するための偽のクラスを作成し、接続とオブジェクトの作成に追跡を追加しました。

<?php

interface iDatabase
{
   static public function execute();
   public function instantiatedExecute();
}

abstract class database implements iDatabase
{

    protected static $conn;

    /**
     * create an instance of database that uses the same connection across all instances
     */
    final public function __construct()
    {
        self::connect();
    }

    /**
     * Connect to a database if not already connected
     */
    final protected static function connect()
    {
        if (null === self::$conn || false === (self::$conn instanceof mysqli)) {
            self::$conn = new mysqli( /* DB info */ );
            //add error checking here...
        }
        return self::$conn;
    }

   /**
    * query database connection
    */
   final public function query($query)
   {
       return self::doQuery($query);
   }

   /**
    * static query database connection
    */
   final public static function doQuery($query)
   {

      //sanitize query here if desired
      return self::connect()->query($query);
   }

}

class example extends database
{

    /**
     * example specific static execution
     */
    public static function execute($query)
    {
        self::doQuery($query);
    }

    /**
     * example specific non-static execution
     */
    public function instantiatedExecute($query)
    {
       $this->query($query);
    }
}
于 2014-09-11T20:01:10.357 に答える
0

ここに同様の投稿

静的メソッドから非静的メソッドを呼び出す唯一の方法は、非静的メソッドを含むクラスのインスタンスを作成することです。定義上、非静的メソッドは、あるクラスのインスタンスでONと呼ばれるメソッドですが、静的メソッドはクラス自体に属します。

于 2013-02-27T17:40:27.543 に答える