Hello, I tried to register in RFC Wiki but I get the error "That wasn't the
answer we were expecting", but in all cases, I'm David Rodrigues, and I
like to suggest a method to initialize objects by using an object
initializar. Currently it is supported on C# -- read here
<https://msdn.microsoft.com/en-us/library/bb397680.aspx?f=255&MSPPError=-2147217396>
..
Basically, it'll allow you create a new instance of some object and set
your properties directly.
*Class example:*
class Example {
public $a;
protected $b;
private $c;
private $d;
public function __construct($d) {
$this->d = $d;
}
}
*Currently:*
*// Public scope:*
$example = new Example($d);
$example->a = $a;
$example->b = $b; // error, protected
$example->c = $c; // error, private
return $example;
*// Protected scope:*
$example = new Example($d);
$example->a = $a;
$example->b = $b;
$example->c = $c; // error, private
return $example;
*// Private scope:*
$example = new Example($d);
$example->a = $a;
$example->b = $b;
$example->c = $c;
return $example;
*Using object initializer:*
*// Public scope:*
return new Example($d) {
$a => $a,
$b => $b, // error, protected
$c => $c, // error, private
};
*// Protected scope:*
return new Example($d) {
$a => $a,
$b => $b,
$c => $c, // error, private
};
*// Private scope:*
return new Example($d) {
$a => $a,
$b => $b,
$c => $c,
};
*Variation:*
*// Constructor without required arguments:*
return new User {
$name => "John",
$surname => "Doe",
};
*// Object initializer as array:*
return new User [
$name => "John",
$surname => "Doe",
];
*Others RFCs:*
We have two RFCs about that, one was declined (Automatic Property
Initialization <https://wiki.php.net/rfc/automatic_property_initialization>),
other in draft (Constructor Argument Promotion
<https://wiki.php.net/rfc/constructor-promotion>). This second one, I think
that not is too clear what I'm trying to do, just by set visibility
keywords before argument (like __construct(private $name)). And too, it'll
affect all methods parsing, by checking if it is the __construct method,
and if was setted visibility keywords.
In my suggestion, that is similar to C#, it'll be done after the class
initialization, probability less costly to parser. Probably it'll affect
this:
new_expr:
T_NEW class_name_reference ctor_arguments object_initializer
{ $$ = zend_ast_create(ZEND_AST_NEW, $2, $3); }
| T_NEW anonymous_class
{ $$ = $2; }
;
object_initializer:
/* empty */
| '{' object_initializer_list '}'
--
David S. Rodrigues