Учитывая, что класс PHP был бы лучшим и самым простым способом переопределить один или два его метода одним из ваших собственных? - PullRequest
1 голос
/ 21 мая 2010

Вот цель. У меня есть класс PHP, и есть один или два из его методов, которые я хотел бы переопределить своим собственным. Как я понимаю ООП (в PHP и вообще), я мог бы написать дочерний класс, который расширяет его и переопределяет функциональность рассматриваемых методов.

Однако мне было интересно, является ли это лучшим способом решения этой задачи и является ли это правильным использованием для дочерних классов или есть ли что-то лучшее в PHP для того, что я пытаюсь сделать.

Ответы [ 8 ]

3 голосов
/ 21 мая 2010

Да, это лучший способ сделать это. Идея расширения класса заключается в предоставлении дополнительных или более специфических функций.

2 голосов
/ 21 мая 2010

Итак, вы спрашиваете, является ли переопределение методов (которое требует расширения суперкласса) лучшим способом переопределения методов? Да.

Это самое важное использование подклассов. Фактически, полиморфизм лежит в основе ООП. Другое использование заключается в предоставлении новых свойств / методов, но этого обычно недостаточно.

2 голосов
/ 21 мая 2010

да. это именно то, для чего вы используете наследование.

Тем не менее, хороший принцип - убедиться, что ваш новый наследующий класс является базовым классом is-a.

Как Human is-a Mammal. Не делайте Alien extends Human только потому, что Чужой делает много вещей, которые делают Люди.

1 голос
/ 22 мая 2010

вы на правильном пути

1 голос
/ 21 мая 2010

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

1 голос
/ 21 мая 2010
class oldClass {
  public function methodToOverride() {
    echo 'oh hai';
  }
}

class childClass extends oldClass {
  public function methodToOverride($arg, $arg2) {
    // your custom code
    echo 'hai world ' . $arg . ' ' . $arg2;

    // if you need to still call the parent class
    parent::methodToOverride();
  }
}

$child = new childClass();
$child->methodToOverride('nom', 'nom');
1 голос
/ 21 мая 2010

Единственным другим способом было бы создание универсального "суперкласса" ...

class SuperClass {
    protected $obj = null;
    protected $overrides = array();

    public function __construct($obj) {
        if (!is_object($obj)) {
            throw new InvalidArgumentException('Argument is not an object');
        }
        $this->obj = $obj;
    }

    public function __call($method, $args) {
        $method = strtolower($method);
        if (isset($this->overrides[$method])) {
            array_unshift($args, $this);
            return call_user_func_array($this->overrides[$method], $args);
        } elseif (is_callable(array($this->obj, $method))) {
            return call_user_func_array(array($this->obj, $method), $args);
        } else {
            throw new BadMethodCallException('Invalid Method Called');
        }
    }

    public function __get($var) {
        return isset($this->obj->$var) ? $this->obj->$var : null;
    }

    public function __set($var, $value) {
        $this->obj->$var = $value;
    }

    public function addOverride($method, $callback) {
        $this->overrides[strtolower($method)] = $callback;
    }
}

Это не всегда лучшее решение, но возможно, что существуют ситуации, в которых можно использовать что-то подобное. Это позволит вам «добавлять» и «переопределять» методы к любому объекту во время выполнения.

Лучшее общее решение состоит в том, чтобы просто расширить класс в дочернем классе ... Но вышеупомянутый "суперкласс" действительно имеет некоторое применение ...

1 голос
/ 21 мая 2010

Звучит так, как будто вы на правильном пути.

Для методов, которые вы хотите переопределить, вы, вероятно, захотите:

  • убедитесь, что вы не меняете цель метода
  • знает, нужно ли вам вызывать метод базового класса внутри, и когда
...