aufrufen Ich möchte meine eigene Klasse, die ich für die Interaktion mit einer Datenbank verwenden kann, und ich denke, es wäre einfach und lesbar, wenn ich Methodenverkettung verwende. Aber ich habe ein Problem, die erste Methode statisch aufzurufen. Hierwie Methode mit "::" in der ersten und "->" für den Rest in Methodenverkettung
ist der Code:
<?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>';
Eigentlich ist dieser Code funktioniert gut, wenn ich getInstance()
Methode zunächst verwenden, wie oben gezeigt. Aber wie kann ich es funktioniert, wenn ich direkt an die select() Methode als statische Methode nennen wie:
$chat = Crud::select('nama', 'teks')->from('chat')->get();
Wenn ich führen Sie den Code oben ich einen Fehler, wie zum Beispiel:
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
Ich weiß, dass die Methode select() eine statische Methode sein sollte, bevor sie mit ::
(glaube ich) aufgerufen werden kann, aber wie kann ich sie statisch machen lassen?
Sie können nur 'verwenden ::' mit statischen Methoden und '->' mit Instanzmethoden. Du musst eine Instanz mit deiner statischen Methode erhalten, dann benutze '->', um folgendes zu verketten: 'Crud :: getInstance() -> select ('nama', 'teks') -> von ('chat') -> get(); ' –
ja danke fürs Kommentieren. momentan frage ich mich noch, wie ich statisch auf die select() methode anwenden kann und mit '->' für andere methoden zugewiesen werden kann. Ich weiß immer noch nicht, wie man das löst :( – Mhari
Siehe meine ausführlichere Antwort.Die kurze Version ist, dass es möglich ist, magische Methoden zu verwenden, damit Sie vorgeben, dass Instanzmethoden statische Methoden sind, wenn es nötig ist, aber es ist nicht einfach. –