データベースとのやりとりに使用できる独自のクラスを作成したいと思っています。メソッド連鎖を使用すると簡単で読みやすくなります。 しかし、最初のメソッドを静的に呼び出す際に問題があります。上記のように、私が最初にgetInstance()
方法を使用する場合最初のメソッドでは "::"、残りのメソッドチェーンでは " - >"でメソッドを呼び出す方法
<?php
class Crud
{
protected static $action;
protected static $instance = null;
protected static $columns = [];
protected $data;
protected $db;
protected $query;
protected $table;
public function __construct()
{
$this->db = new mysqli('localhost', 'root', '', 'bahan_belajar');
if (!$this->db) {
echo "error";
}
return $this;
}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
public function select()
{
if (empty(func_get_args())) {
// $this->columns = "*";
self::$columns = "*";
} else {
if (is_array(func_get_args())) {
// self::columns = join(', ', func_get_args());
self::$columns = join(', ', func_get_args());
} else {
// self::columns = func_get_args();
self::$columns = func_get_args();
}
}
self::$action = "SELECT";
return $this;
}
public function from($tableName)
{
$this->table = ' FROM ' . $tableName;
return $this;
}
public function get($getName = 'object')
{
$this->query = self::$action . ' ' . self::$columns . ' ' . $this->table;
switch ($getName) {
case 'object':
$this->data = $this->db->query($this->query)->fetch_object();
break;
case 'array':
$this->data = $this->db->query($this->query)->fetch_array();
break;
case 'count':
$this->data = $this->db->query($this->query)->num_rows;
break;
}
return $this->data;
}
}
$chat = Crud::getInstance()->select('nama', 'teks')->from('chat')->get();
echo '<pre>';
print_r($chat);
echo '</pre>';
実際には、このコードが正常に動作し:ここ
コードです。しかし、私は私のような静的メソッドとしてselect()メソッドを直接呼び出すとき、それがどのように機能するかを行うことができます。
$chat = Crud::select('nama', 'teks')->from('chat')->get();
私は私のようなエラーになります上記のコードを実行した場合:
Fatal error: Uncaught Error: Using $this when not in object context in C:\xampp\htdocs\bahan_belajar\chat\classes.php:47 Stack trace: #0 C:\xampp\htdocs\bahan_belajar\chat\classes.php(74): Crud::select('nama', 'teks') #1 {main} thrown in C:\xampp\htdocs\bahan_belajar\chat\classes.php on line 47
私はselect()メソッドが::
で呼び出す前に静的メソッドでなければならないことを知っていますが、どうすれば静的にすることができますか?
静的メソッドでは '::'のみ、インスタンスメソッドでは ' - > 'を使用できます。 'Crud :: getInstance() - > select( 'nama'、 'teks') - > from( 'chat')のように、静的メソッドでインスタンスを取得し、 - > get(); ' –
コメントありがとうございます。現在私はまだselect()メソッドで静的を適用する方法について疑問を持ち、他のメソッドには ' - >' assignを続けることができます。私はまだこれを解決する方法を知らない:( – Mhari
私のより詳細な答えを見てください。短いバージョンでは、魔法のメソッドを使って、インスタンスメソッドが静的メソッドであると見せかけることが可能になることがありますが、それは簡単ではありません。 –