Как вызвать из родителя дочерний конструктор класса?

moscower

Новичок
Как вызвать из родителя дочерний конструктор класса?

class class1 {
public static function instance() {
return new self();
}
}

class class2 extends class1 {
}

$obj = class2::instance();

получаем объект класса class1, возможно ли как-то создать объект в class1, чтобы не писать код в class2, чтобы вызвав метод class1 получить class2 (то есть того класса, который вызывали собственно).
 

romy4

invoke [brain]
это нехорошая организация структуры, когда родитель должен знать своих потомков.
 

moscower

Новичок
да он не должен знать - клиент должен знать, а родитель должен по принципу полиморфизма вызвать не свой метод - а дочерний - клиента. А он вызывает свой.
 

dark-demon

d(^-^)b
return new this;

а если хочется вызывать методы одного объекта в контексте другого - можно воспользоваться методом apply :)
 

korchasa

LIMB infected
Автор оригинала: moscower
да он не должен знать - клиент должен знать, а родитель должен по принципу полиморфизма вызвать не свой метод - а дочерний - клиента. А он вызывает свой.
Не должен это все таки статика. Статические методы принято рассматривать, как своего рода "утилиты" класса, дополнительные фичи. Поэтому они должны выполняться в кнтексте класса, у которого они описаны. Но есть случаи, когда это нужно обойти. В РНР 5.3 будет нативная функция get_calling_class, а в версиях младше можно использовать грязный хак:
PHP:
$trace = debug_backtrace();
$back = $trace[1];
$method = $back['function'];
$fp = fopen($back['file'], 'r');

for($i=0; $i<$back['line']-1; $i++)
  fgets($fp);

$line = fgets($fp);
fclose($fp);

if(!preg_match('~(\w+)\s*::\s*' . $method . '\s*\(~', $line, $m))
      throw new lmbARException("Static calling class not found!(using multiline static method call?)");
if($m[1] == 'lmbActiveRecord')
  throw new lmbARException("Found static class can't be lmbActiveRecord!");
return $m[1];
Класс https://svn.limb-project.com/limb/3.x/trunk/limb/active_record/src/lmbActiveRecord.class.php
 
Сверху