如何在PHP中向对象添加方法?

时间:2010-01-27 17:29:23

标签: php oop class

我有一个面向对象的库我想添加一个方法,虽然我很确定我可以进入该库的源并添加它,我想这就是通常所说的A Bad想法。

我如何正确地将自己的方法添加到PHP对象?

更新 **编辑**

我正在尝试添加方法的库是simpleHTML,没什么特别的,只是一种提高可读性的方法。所以我尝试添加到我的代码中:

class simpleHTMLDOM extends simple_html_dom {
  public function remove_node() {
    $this->outertext = "";
  }
}

让我:Fatal error: Call to undefined method simple_html_dom_node::remove_node()。很明显,当你在simpleHTML中获取一个元素时,它返回一个类型为simple_html_dom_node的对象。

如果我将方法添加到simple_html_dom_node,那么我的子类不是由simpleHTML创建的......所以要坚持下一步去哪里。

4 个答案:

答案 0 :(得分:6)

解决方案是创建一个新类,从库中扩展一个类 - 然后使用你的类,它拥有原始类的所有方法,加上你的类。

这是一个(非常快速和简单)的示例:

class YourClass extends TheLibraryClass {
  public function yourNewMethod() {
    // do what you want here
  }
}

然后,你使用你的班级:

$obj = new YourClass();
$obj->yourNewMethod();

你可以调用TheLibraryClass类的方法,因为你继承了那个的属性和方法:

$obj->aMethodFromTheLibrary();


关于这一点,您可以查看手册的Object Inheritance部分。


而且,正如您所猜测的那样,修改库肯定是一个坏主意:每次更新库时都必须重新进行修改!

(有一天,你会忘记 - 或者你的一个同事会忘记^^)

答案 1 :(得分:3)

可以继承,但如果你不需要从SimpleHtml访问任何受保护的成员,你也可以使用decorator pattern。这是一种更灵活的方法。有关详细信息,请参阅链接页面。

class MySimpleHtmlExtension
{
     protected $_dom;

     public function __construct(simple_html_dom $simpleHtml)
     {
         $this->_dom = $simpleHtml;
     }

     public function removeNode(simple_html_dom_node $node)
     {
         $node->outertext = '';
         return $this;
     }

     public function __call($method, $args)
     {
         if(method_exists($this->_dom, $method)) {
             return call_user_func_array(array($this->_dom , $method), $args));
         }
         throw new BadMethodCallException("$method does not exist");
     }

}

你可以像上面这样使用

$ext = new MySimpleHtmlExtension( new simple_html_dom );
$ext->load('<html><body>Hello <span>World</span>!</body></html>');
$ext->removeNode( $ext->find('span', 0) );

答案 2 :(得分:0)

我不知道为什么添加方法会很糟糕,但是如果你想在不编辑库的情况下这样做,最好的办法是扩展类,如下所示:

class NewClass extends OldClass {

  function newMethod() {
    //do stuff
  }

}

答案 3 :(得分:0)

class myExtenstionClass extends SomeClassInLibrary
{

  public function myMethod()
  {
     // your function definition
  }
}

正如Pascal建议的......阅读手册: - )