PHP: вызовите дочернего конструктора от статического метода в родителе

Я хочу иметь статический метод в родительском классе, который создает экземпляры любого подкласса, я обращаюсь к этому методу.

Пример для создания этого более ясным:

class parent {
    public static method make_objects($conditions){
        for (...){
            // here i want to create an instance
            // of whatever subclass i am calling make_objects on
            // based on certain $conditions
        }
    }
}

class sub extends parent{
    ...
}

$objects = sub::make_objects($some_conditions);
10
задан martijnve 2 August 2010 в 20:53
поделиться

3 ответа

Начиная с php 5.3, вы можете использовать ключевое слово static для этого

<?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);

отпечатков

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

редактировать: другой (аналогичный) пример

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

печатает

t=A
 A::__construct
  type of o=A
t=B
 B::__construct
  type of o=B
t=C
 C::__construct
  type of o=C
11
ответ дан 4 December 2019 в 00:59
поделиться

Я думаю, вам нужно что-то вроде этого:

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

class sub extends parent {

}

Теперь вы можете создать такой экземпляр:

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

или

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

Но почему вы хотите, чтобы все подклассы расширяли родительский ? Разве вам не лучше иметь родительский элемент для ваших моделей (подклассов), а затем фабричный класс, который создает экземпляры для этих моделей в зависимости от заданных условий?

1
ответ дан 4 December 2019 в 00:59
поделиться

Ммм, разве это не было бы:

class sub extends parent {
  public static function make_objects($conditions) {
    //sub specific stuff here
    //....
  }
}
0
ответ дан 4 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: