【问题标题】:How do I add a method to an object in PHP?如何在 PHP 中向对象添加方法?
【发布时间】:2010-01-27 17:29:23
【问题描述】:

我有一个面向对象的库,我想添加一个方法,虽然我很确定我可以进入该库的源并添加它,但我想这就是通常所说的 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 我的子类不是 simplHTML 将创建的......所以坚持到下一步去哪里。

【问题讨论】:

  • 不知道为什么这被否决了,所以这里是 +1
  • 能否添加实例化对象并调用 remove_node() 方法的代码?

标签: php oop class


【解决方案1】:

一种解决方案是创建一个新类,从您的库中扩展该类,然后使用您的类,该类具有原始类的所有方法以及您的方法。

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

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

然后,你使用你的类:

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

您可以调用TheLibraryClass 类的方法,因为您继承了该类的属性和方法:

$obj->aMethodFromTheLibrary();


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


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

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

【讨论】:

  • 谢谢,仍然有问题,在上面进行了编辑。老实说,只是将我的方法放入源代码中,但如果可以的话,我想“正确”地做。
【解决方案2】:

可以通过继承来实现,但如果您不需要访问 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) );

【讨论】:

  • 这是问题所在 - 该方法实际上是在 simple_dom_html_node 对象上调用的 - 这是由 simple_dom_html 对象创建的。我认为没有解决办法。
【解决方案3】:

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

class NewClass extends OldClass {

  function newMethod() {
    //do stuff
  }

}

【讨论】:

  • 添加方法不好,因为如果你更新库,或者库改变了它的内部实现,你很容易出现兼容性问题。
  • 是的,但到目前为止,我无法通过扩展类来实现这一点。希望有人可以根据我的编辑提供帮助。
【解决方案4】:
class myExtenstionClass extends SomeClassInLibrary
{

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

正如 Pascal 建议的那样……阅读手册 :-)

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 2013-09-23
    • 2012-06-09
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2012-07-15
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多