class A{ public $b; public $f; function __construct( B $b , $f = 1 ){ $this->b = $b; $this->f = $f; } } class B{} class GenClass{ public function getObj( $class ,$params = [] ){ $rel = new ReflectionClass( $class ); $paramObjs = $rel->getConstructor()->getParameters(); $parIns = $this->getParIns($paramObjs); $ret = $rel->newInstanceArgs($parIns); return $ret; } public function getParIns( $paramObjs ){ $ret = []; foreach ( $paramObjs as $params){ $dep = $params->getClass(); if ($params->isDefaultValueAvailable()) { $ret[] = $params->getDefaultValue(); }else{ $ret[] = $this->getIns( $params->name ); } } return $ret; } public function getIns( $class, $param = [] ){ return new $class(); } } $s = (new GenClass())->getObj('A',[]); var_dump($s); die();