Ошибка выдачи по строгим стандартам PHP для подкласса, который не переопределяет метод суперкласса

#php #class #standards #strict #implements

#php #класс #стандарты #строгий #реализует

Вопрос:

Я сталкиваюсь со следующим предупреждением:

Строгие стандарты: Объявление FGLU_Activity::delete() должно быть совместимо с FGLU_Entity::delete($id, $commit = true) в …

FGLU_Activity расширяет FGLU_Entity и не переопределяет метод static ::delete.

Есть какие-либо подсказки относительно того, как избежать этой ошибки в следующий раз, когда я с ней столкнусь?

 <?php

class FGLU_Entity {

    /*
     * ...
     */


    static function delete($id,$commit=true) {

        global $wpdb;

        // first, delete any rows in mapped tables
        $total_count = 0;
        if ($commit) $wpdb->query("START TRANSACTION");

        $instance = new static::$class_name();
        $instance->{static::$key} = $id;

        /*
         * ...
         */

        // then, delete the base row
        $needles = array("xa_table","xa_key","xa_id");
        $threads = array(static::$table,static::$key,$id);
        $sql = fglu_sql(FGLU_SQL_DELETE,$needles,$threads);
        $row_count = $wpdb->query($sql);
        if ($row_count === false) {
            fglu_setError(__METHOD__,"SQL Error<br/>$sql<br/>$wpdb->last_error");
            if ($commit) $wpdb->query("ROLLBACK");
            return false;
        } else {
            if ($commit) $wpdb->query("COMMIT");
            $total_count  = $row_count;
            return $total_count;
        }

    }
    /**/


}


class FGLU_Activity extends FGLU_Entity {

    // Keys
    public $activity_id;

    // Required Attributes
    public $name;                   
    public $short;                  

    public $activity_cd;            
    public $display_order;          
    public $private = 0;            
    public $school_visit = 0;       
    public $report = 0;             
    public $capacity = 0;           

    // System Attributes

    public $id_user;
    public $dt_updated;

    /*
     * ...
     */

}
  

?>

Комментарии:

1. покажите нам код обоих классов?

2. добавьте это в вопрос, а не в комментарий

3. Дочерний delete метод удалит что? Может быть, это нужно $id также в качестве аргумента???????????

4. Я опустил большую часть кода в классах, но дело в том, что статический метод удаления не определен в дочернем. Он просто наследуется от базового класса. Код работает (записи удаляются), но он выдает предупреждение, когда PHP выполняется со строгими стандартами.

5. есть ли какие-либо другие символы, названные delete в этом классе?

Ответ №1:

FGLU_Activity расширяет FGLU_Entity и не переопределяет метод static ::delete.

Есть какие-либо подсказки относительно того, как избежать этой ошибки в следующий раз, когда я с ней столкнусь?

У вас есть подкласс, содержащий метод delete() с аргументами, которые не совпадают с аргументами метода delete() в родительском классе. На самом деле это не ошибка. Если функциональность не соответствует, переименуйте дочерний метод, чтобы показать это, или, если это так, но аргументы в родительских файлах излишни, добавьте FGLU_Activity($id=NULL,$commit=NULL).

Вы бы не получили эту ошибку, если бы вы также не объявили метод в дочернем классе.

Либо это, либо я действительно что-то упускаю. Статические методы по-прежнему подчиняются стандартным правилам, касающимся видимости, наследования и т.д., Так что на самом деле проблема здесь не в этом.

Комментарии:

1. вы абсолютно правы, я пропустил метод delete в подклассе. Спасибо.