moin,
ok. Hat super geklappt!
class SQL {
/* Traits */
use SQLClause;
/**
* @var string
*/
private $statement;
/**
* @var array
*/
private $params;
/**
* @var array
*/
private $stack;
/**
* @params string
*/
public function addStatement( string $piece ) : void {
$this->statement .= $piece;
}
/**
* @params string
*/
public function addParams( string $value ) : void {
$this->params[] = $value;
}
/**
* @params string
*/
public function addStack( string $chain ) : void {
$this->stack[] = $chain;
}
trait SQLClause {
// other clause functions
public function where( array $conditions ) : SQL {
$this->addStack( SQLSyntax::WHERE );
$this->addStatement( "WHERE " );
// foreach and other stuff
$this->addParams( $value );
return $this;
}
// other clause functions
}
jedoch sieht es mit den nicht initialisierten (oder Leer String) Properties der externen Klasse SQL Übel aus, die noch durch den Konstruktor initialisiert werden müssen.
ich habe da noch eine Methode in der externen Klasse SQL geschrieben die von einem Trait SQLClause erwartet wird. Da bin ich auf den Fehler gestoßen.
/**
* @var array $scheme
*/
private $scheme;
// …
public function __constructor( string $scheme ) {
$this->scheme = $scheme;
}
/**
* @params string
*/
public function getScheme() : string {
return $this->scheme;
}
in der SQLClause::from( string $table ) : SQL
wird dann zusätzlich noch durch $this->getScheme()
ein Datenbank Schema vor der Tabelle hin gesetzt
$this->addStatement( "\nFROM `" .$this->getScheme(). ".{$table}` " ) : SQL;
Er sag mir immer wieder…
Return value of SQL::getScheme() must be of the type string, null returned
Ich hab ne leihenhafte Vermutung das die Instanziierung der externen Klasse SQL vorab die Trait SQLClause einbindet und SQLClause die SQL Properties in der Methopde blank verwendet bevor eine instanziierung der Properties im SQL Konstruktor vollzogen ist. Das habe ich mit einem String in einem Property getestet private $scheme = 'firma';
und würde FROM 'firma.kunde'
enstehen und es funzt. Aber meine vermutung ist noch nicht ausgereift und eben eine leihenhafte. Ich hoffe sehr das es verständlich ist.
lgmb