PHP: call child constructor from static method in parent

前端 未结 4 1820
天命终不由人
天命终不由人 2021-01-17 17:45

I want to have a static method in a parent class that creates instances of whatever subclass i call this method on.

An example to make this more clear:

cl         


        
相关标签:
4条回答
  • 2021-01-17 18:00

    As of php 5.3 you can use the static keyword for this

    <?php
    class A {
      public static function newInstance() {
        $rv = new static();  
        return $rv;
      }
    }
    class B extends A { }
    class C extends B { }
    
    $o = A::newInstance(); var_dump($o);
    $o = B::newInstance(); var_dump($o);
    $o = C::newInstance(); var_dump($o);
    

    prints

    object(A)#1 (0) {
    }
    object(B)#2 (0) {
    }
    object(C)#1 (0) {
    }
    

    edit: another (similar) example

    <?php
    class A {
      public static function newInstance() {
        $rv = new static();  
        return $rv;
      }
    
      public function __construct() { echo " A::__construct\n"; }
    }
    class B extends A {
      public function __construct() { echo " B::__construct\n"; }
    }
    class C extends B {
      public function __construct() { echo " C::__construct\n"; }   
    }
    
    $types = array('A', 'B', 'C');
    foreach( $types as $t ) {
      echo 't=', $t, "\n";
      $o = $t::newInstance();
      echo '  type of o=', get_class($o), "\n";
    }
    

    prints

    t=A
     A::__construct
      type of o=A
    t=B
     B::__construct
      type of o=B
    t=C
     C::__construct
      type of o=C
    
    0 讨论(0)
  • 2021-01-17 18:10

    I think you want something like this:

    class parent {
      public static function make_object($conditionns) {
        if($conditions == "case1") {
          return new sub();
        }
      }
    }
    
    class sub extends parent {
    
    }
    

    Now you can create an instance like this:

    $instance = parent::make_object("case1");
    

    or

    $instance = sub::make_object("case1");
    

    But why would you want all the sub classes to extend the parent? Shouldn't you much rather have a parent for your models (sub classes) and then a factory class, that creates the instances for this models depending on the conditions given?

    0 讨论(0)
  • 2021-01-17 18:10

    make the parent class an abstract class and make the parent method also an abstract

    abstract static class parent {
         abstract function make_method() {
             // your process
         }
    }
    
    class child extends parent {
         public function __construct() {
              parent::make_method();
         }
    }
    
    0 讨论(0)
  • 2021-01-17 18:23

    Umm, wouldn't that be:

    class sub extends parent {
      public static function make_objects($conditions) {
        //sub specific stuff here
        //....
      }
    }
    
    0 讨论(0)
提交回复
热议问题