エラーが発生しています:
Using $this when not in object context for$this->filterArray
したがって、これを次のように変更するself::filterArray
と、次のエラーが表示されます:不明: 非静的メソッド Abstract::filterArray() を静的に呼び出すべきではありません
これが正しいかどうか、または抽象またはインターフェイスを使用する必要があるかどうかはわかりませんか?
基本的に私がやろうとしているのは、array(column_name => type)
このように使用して強制データ型の基本的な挿入を作成できるようにセットアップすることです。
$cols = SentDAO::describe();
foreach ($cols as $col => $type) {
if (!isset($data[$col])) continue;
switch ($type) {
case self::INT: $value = intval($data[$col]);
case self::TEXT: $value = $this->escape($data[$col]);
case self::DATE_NOW: $value = 'NOW()';
}
$return[] = " {$col} = '{$value}'";
}
最終的に何百もの異なるオブジェクトを作成することは避け、配列に単純に格納したいと考えました。
/**
* Abstract
*
*/
abstract class AccountsAbstract
{
/**
* Data Types
*/
const INT = "INT";
const TEXT = "TEXT";
const DATE_NOW = "DATE_NOW";
/**
* Get columns with data type
* @param array $filter: exclude columns
* @return array
*/
abstract static function describe($filter);
/**
* Filter from array, by unsetting element(s)
* @param string/array $filter - match array key
* @param array to be filtered
* @return array
*/
protected function filterArray($filter, $array)
{
if($filter === null) return $array;
if(is_array($filter)){
foreach($filter as $f){
unset($array[$f]);
}
} else {
unset($array[$filter]);
}
return $array;
}
}
class AccountsDAO extends AccountsAbstract
{
/**
* Columns & Data Types.
* @see AccountsAbstract::describe()
*/
public static function describe($filter)
{
$cols = array(
'account_id' => AccountsAbstract::INT,
'key' => AccountsAbstract::TEXT,
'config_id' => AccountsAbstract::INT
);
return $this->filterArray($cols, $filter);
}
}
/**
* Records
*/
class AccountsRecordsDAO extends AccountsAbstract
{
public static function describe($filter)
{
$cols = array(
'record_id' => AccountsAbstract::INT,
'created' => AccountsAbstract::DATE_NOW,
'customer_id' => AccountsAbstract::INT
);
return $this->filterArray($cols, $filter);
}
}
/**
* Config
*/
class AccountsConfigDAO extends AccountsAbstract
{
public static function describe($filter)
{
$cols = array(
'config_id' => AccountsAbstract::INT,
'hidden' => AccountsAbstract::INT,
'language_id' => AccountsAbstract::INT
);
return $this->filterArray($cols, $filter);
}
}
また、完全なクラス名を使用すると、コードが非常に面倒になり、移植性が低下すると思います: 、代わりAccountsAbstract::INT
に使用する方法はありますか? self::INT
または、参照されているだけで変更されることはありませんが、これらをプライベート プロパティとして作成する必要があります。