I don't know why but i don't like using the new operator in my code.
Here is a static function to create an instance of a class called statically.
class ClassName {
public static function init(){
return (new ReflectionClass(get_called_class()))->newInstanceArgs(func_get_args());
}
public static function initArray($array=[]){
return (new ReflectionClass(get_called_class()))->newInstanceArgs($array);
}
public function __construct($arg1, $arg2, $arg3){
///construction code
}
}
If you are using it inside a namespace you need to escape ReflectionClass like so: new \ReflectionClass...
Now you can call the init() method with a variable number of arguments and it will pass it on to the constructor and return an object for you.
Normal way using new
$obj = new ClassName('arg1', 'arg2', 'arg3');
echo $obj->method1()->method2();
Inline way using new
echo (new ClassName('arg1', 'arg2', 'arg3'))->method1()->method2();
Static call using init instead of new
echo ClassName::init('arg1', 'arg2', 'arg3')->method1()->method2();
Static call using initArray instead of new
echo ClassName::initArray(['arg1', 'arg2', 'arg3'])->method1()->method2();
The nice thing about the static methods is that you can run some pre construction operations in the init methods such as constructor argument validation.