Как добавить метод к объекту в PHP? - PullRequest
4 голосов
/ 27 января 2010

У меня есть объектно-ориентированная библиотека, в которую я хотел добавить метод, и хотя я совершенно уверен, что могу просто зайти в источник этой библиотеки и добавить его, я думаю, это то, что обычно известно как A BadИдея.

Как мне правильно добавить собственный метод в объект PHP?

ОБНОВЛЕНИЕ ** редактирование **

Библиотека Iя пытаюсь добавить метод к 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, мой подкласс - это не то, что будет создано simpHTML ... так что застрял в том, куда идти дальше.

Ответы [ 4 ]

6 голосов
/ 27 января 2010

Решением было бы создать новый класс, который расширяет класс из вашей библиотеки, и затем использовать ваш класс, у которого есть все методы исходного, плюс ваш.

Вот (очень быстро и просто) пример:

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

А затем вы используете свой класс:

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

И вы можете вызывать методы класса TheLibraryClass, поскольку ваш наследует свойства и методы этого класса:

$obj->aMethodFromTheLibrary();


Об этом вы можете прочитать в разделе Наследование объектов данного руководства.


И, как вы уже догадались, изменение библиотеки, безусловно, плохая идея: вам придется повторять эту модификацию каждый раз, когда вы обновляете библиотеку!

(Однажды вы забудете - или один из ваших коллег забудет ^^)

3 голосов
/ 27 января 2010

Вы можете сделать это с наследованием, но вы также можете использовать шаблон декоратора , если вам не нужен доступ к каким-либо защищенным членам из 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) );
0 голосов
/ 27 января 2010
class myExtenstionClass extends SomeClassInLibrary
{

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

Как предлагает Паскаль ... прочитайте инструкцию: -)

0 голосов
/ 27 января 2010

Не знаю, почему добавить метод было бы плохо, однако, если вы захотите сделать это без редактирования библиотеки, лучше всего было бы расширить класс следующим образом:

class NewClass extends OldClass {

  function newMethod() {
    //do stuff
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...