0

エラーが発生しています: 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または、参照されているだけで変更されることはありませんが、これらをプライベート プロパティとして作成する必要があります。

4

1 に答える 1

1

静的メソッドから filterArray を呼び出しています。つまり、$this インスタンスがありません。

filterArray の実装は $this を必要としないように見えるため、これも静的メソッドにして、経由で呼び出すことができます。self::filterArray($filter, $array)

于 2013-03-18T08:53:53.290 に答える