2010-05-21 49 views
1

这是目标。我有一个PHP类,我想用我自己的方法重写它的一个或两个方法。据我所知,OOP(在PHP和一般情况下)我可以编写一个子类来扩展它,并覆盖有问题的方法的功能。给定一个PHP类将是用其中一个方法覆盖其一个或两个方法的最好和最简单的方法?

但是,我想知道这是否是实现此任务的最佳方式,以及这是否适合用于子类或者是否有更好的PHP用于我正在尝试做的事情。

回答

1
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'); 
+0

苛刻-1来得到正确的答案。 nom noms是有效的。 – 2010-05-21 18:50:23

+1

大家都知道,那不是我的男人,而是那些花时间回答n00b(如我自己)问题的人:我感谢任何人努力阅读我的问题并给我一个答案,我绝不会给任何人一个拇指向下或-1。 – racl101 2010-05-21 19:07:09

3

是的,那是最好的办法。扩展类的想法是提供额外或更具体的功能。

2

是的。这正是你使用继承的原因。

不过,一个好的原则是确保你的新继承类是“一个”基类。

Like Human is-a Mammal。不要因为外星人做了很多人类的事情而做Alien extends Human

+0

是啊很好指出。我记得几年前,当我第一次开始使用PHP的OOP时,通过完成你所描述的内容来让自己陷入一团糟。 现在我发现,即使在一个复杂的项目中,我的课程都非常简短。复杂性来自于如何组合类。如果你的大脑正在试图写一些大规模的方法因为你需要处理大量的案例或变体,那么你可能想要回顾一下你的类是如何构造的 – Addsy 2010-05-21 20:01:05

2

那么,你问是否覆盖方法(这需要扩展超类)是覆盖方法的最好方法?是。

这是子类最重要的用途。事实上,多态是OOP的核心。另一个用途是提供新的属性/方法,但这通常是不够的。

1

听起来像你在正确的轨道上。

对于要覆盖的方法,你可能会想:

  • 确保你不改变方法
  • 的意图知道你是否有调用基类的方法内,当
1

唯一的其他方式,是创建一个通用的 “超” ...

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

我还没有看到这里提到的另一个途径是要质疑提取一个抽象类是否会更好,并让这两个类扩展它。当然,你需要能够改变第一类的代码(例如,如果这个类来自一个开源库,你可能不会改变代码)。

1

你是在正确的轨道上

相关问题