title: OOP matter : Cannot call abstract method
body: <p>I have a PHP core with an abstract class <code>AppBase</code> which use a trait <code>Uninstall</code>.
  To force developper to implement a static function to delete some options inside the main class <code>MyApp</code>, the <code>AppBase</code> implements an interface with a static function 'delete_options()'.</p>
  
  <p><strong>AppBase</strong></p>
  
  <pre><code>abstract class AppBase implements iUninstall{
       use Uninstall;
  }
  </code></pre>
  
  <p><strong>Uninstall</strong></p>
  
  <pre><code>trait Uninstall{
      public static function uninstall(){
         //Do some general stuff
         self::delete_options();
      }
  }
  </code></pre>
  
  <p><strong>iUninstall</strong></p>
  
  <pre><code>interface iUninstall {
      public static function delete_options();
  }
  </code></pre>
  
  <p><strong>MyApp</strong></p>
  
  <pre><code>include_once "core/iUninstall.php";
  include_once "core/Uninstall.php";
  include_once "core/AppBase.php";
  
  class MyApp extends AppBase{
     public static function delete_options() {
          delete_option( "first-option" );
          delete_option( "second-option" );
     }
  }
  </code></pre>
  
  <p>My problem is I got this error:</p>
  
  <blockquote>
    <p>PHP Fatal error: Uncaught Error: Cannot call abstract method iUninstall::delete_options() in Uninstall.php</p>
  </blockquote>
  
  <p>I can see the trait <code>Uninstall</code> must be attached to <code>AppBase</code> to use <code>delete_options</code> so there is a matter in my OOP architecture.</p>
  
  <p>How can I resolve this ?</p>