PHP nasıl bir nesne için bir yöntem eklerim?

4 Cevap php

Ben bir yöntem eklemek istedim bir nesne yönelimli bir kütüphane var, ve ben sadece bu kütüphanenin kaynağına gitmek ve onu ekleyebilirsiniz eminim ederken, bu genellikle kötü bir fikir olarak bilinen ne olduğunu düşünün.

Nasıl doğru bir PHP nesnesine kendi yöntemi ekleme hakkında gitmek istiyorsunuz?

UPDATE ** düzenleme **

Ben bir yöntem eklemek için çalışıyorum kütüphane okunabilirliği artırmak için sadece bir yöntem simpleHTML, fantezi bir şey vardır. Yani benim kodu ekleyerek denedim:

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

beni var ki: Fatal error: Call to undefined method simple_html_dom_node::remove_node(). Eğer simpleHTML bir öğe kapmak zaman Yani açıkçası, bu tip simple_html_dom_node bir nesne döndürür.

I simple_html_dom_node Benim alt sınıf simplHTML tarafından yaratılmış olacak değil ne için yöntemi eklerseniz ... sonraki gitmek nereye şekilde sıkıştı.

4 Cevap

Senin, sonra, orijinal birinin tüm yöntemler var olması sizin sınıf, kullanmak, artı - Bir çözüm kütüphanesinden birini uzanan yeni bir sınıf oluşturmak olacaktır.

İşte (very quick and simple) örnek:

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

Ve, o zaman, size sınıfını kullanın:

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

Senin o birinin özellikleri ve yöntemleri miras gibi Ve sen, TheLibraryClass sınıfının yöntemlerini çağırabilirsiniz:

$obj->aMethodFromTheLibrary();


About that, you can take a look at the Object Inheritance section of the manual.


And, as you guessed, modifying a library is definitly a bad idea : you'll have to re-do that modification each time you update the library !

(One day or another, you'll forget -- or one of your colleagues will forget ^^ )

Sen could kalıtım ile bunu, ama SimpleHtml herhangi korumalı üyelerine erişim gerekmez eğer siz de bir decorator pattern kullanabilirsiniz. Bu, daha esnek bir yaklaşımdır. Ayrıntılar için bağlı sayfaya bakınız.

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");
     }

}

Böyle üzerinde kullanmak istiyorum

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

Ben neden yöntemi ekleyerek, kötü olurdu değil ancak bunu kütüphane düzenleme olmadan, en iyi bahis şöyle sınıfını genişletmek olacaktır istiyorsanız:

class NewClass extends OldClass {

  function newMethod() {
    //do stuff
  }

}
class myExtenstionClass extends SomeClassInLibrary
{

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

Pascal anlaşılacağı gibi ... manuel :-) okumak