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

如何在PHP中向对象添加方法?,php,oop,class,Php,Oop,Class,我有一个面向对象的库,我想向其中添加一个方法,虽然我很确定我可以进入该库的源代码并添加它,但我认为这是一个通常被称为坏主意的想法 如何正确地将自己的方法添加到PHP对象中 更新**编辑** 我试图添加方法的库是simpleHTML,没有什么特别之处,只是一个提高可读性的方法。因此,我尝试在代码中添加: class simpleHTMLDOM extends simple_html_dom { public function remove_node() { $this->oute

我有一个面向对象的库,我想向其中添加一个方法,虽然我很确定我可以进入该库的源代码并添加它,但我认为这是一个通常被称为坏主意的想法

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

更新**编辑**

我试图添加方法的库是simpleHTML,没有什么特别之处,只是一个提高可读性的方法。因此,我尝试在代码中添加:

class simpleHTMLDOM extends simple_html_dom {
  public function remove_node() {
    $this->outertext = "";
  }
}
这让我明白了:
致命错误:调用未定义的方法simple\u html\u dom\u node::remove\u node()
。显然,当您在simpleHTML中获取一个元素时,它会返回一个simple\uHTML\uDOM\uNode类型的对象


如果我将该方法添加到
simple\u html\u dom\u节点
我的子类不是simplehtml将创建的。。。一个解决方案是创建一个新类,从您的库中扩展该类,然后使用您的类,该类拥有原始类的所有方法,再加上您的类

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

class YourClass extends TheLibraryClass {
  public function yourNewMethod() {
    // do what you want here
  }
}
然后,您使用您的类:

$obj = new YourClass();
$obj->yourNewMethod();
您可以调用library类的方法,因为您继承了该类的属性和方法:

$obj->aMethodFromTheLibrary();

关于这一点,您可以查看手册的一节


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


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

我不知道为什么添加该方法是不好的,但是如果你想这样做而不编辑库,最好的办法是像这样扩展类:

class NewClass extends OldClass {

  function newMethod() {
    //do stuff
  }

}
正如帕斯卡所说。。。阅读手册:-)

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

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) );
$ext=new MySimpleHtmlExtension(新的简单html\U dom);
$ext->load('Hello World!');
$ext->removeNode($ext->find('span',0));

不确定为什么会被否决,因此这里有+1您是否可以添加实例化对象并调用remove_node()方法的代码?添加该方法是不好的,因为如果您更新库,或者库更改其内部实现,您很容易出现兼容性问题。是的,但到目前为止,我无法通过扩展类来实现这一点。希望有人能根据我的编辑提供帮助。谢谢,仍然有问题,在上面进行了编辑。老实说,把我的方法放到源代码中是可行的,但如果可以的话,我想做得“正确”。问题是,这个方法实际上在
simple\u dom\u html\u节点
对象上被调用,这个节点是由
simple\u dom\u html
对象创建的。我认为没有解决办法。
$ext = new MySimpleHtmlExtension( new simple_html_dom );
$ext->load('<html><body>Hello <span>World</span>!</body></html>');
$ext->removeNode( $ext->find('span', 0) );