我有一个面向对象的库我想添加一个方法,虽然我很确定我可以进入该库的源并添加它,我想这就是通常所说的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创建的......所以要坚持下一步去哪里。
答案 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建议的......阅读手册: - )