|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2013-07-19 10:20 UTC] llmll at gmx dot de
Description:
------------
As PHP does not support *real* overloading by different parameter sets, arrays are being used for dynamic parameters as well as for object initialization in constructors.
However arrays use strings as keys, which kills syntax highlighting and refactoring capabilities in IDEs.
PHP engine should provide a way to initialize an object inline by dynamically providing parameters to new().
Test script:
---------------
$object = new Object({
StringMember: "content",
Counter: 42,
ArrayMember: ["old" => "way"]
});
Expected result:
----------------
$object->StringMember = "content";
$object->Counter = 42;
$object->ArrayMember = array("old" => "way");
$object->MoreProperties = "stay untouched";
Actual result:
--------------
not possible.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Nov 18 09:00:01 2025 UTC |
Keeping in mind that your IDE could not possibly give you support for arbitrary properties on objects, they probably do support the @property phpdoc. Add that to __get/__set and you have /** * @property string $StringMember * @property int $Counter * @property mixed[] $ArrayMember */ class Foo { private $data; public function __construct(array $data) { $this->data = $data; } public function __get($name) { return $this->data[$name]; } public function __set($name, $value) { $this->data[$name] = $value; } } $foo = new Foo([ "StringMember" => "content", "Counter" => 42, "ArrayMember" => ["old" => "way"] ]); $foo-> // should autocomplete/suggest StringMember, Counter, and ArrayMember If you're talking about the {} syntax you used, https://wiki.php.net/rfc/objectarrayliteralsI view as a strength of PHP, not having to declare all fields in a class. For example think of a class representing a HTML DOM element, like a link. It allow many fields, but most often you will only use some of them, like "href" or "class". In my opinion the best syntax to write is something like: $link = new Link(href: "target.html", class:"btn btn-info"); At the moment I use arrays: $link = (new Link)->assign("href" => "target.html", "class" => "btn btn-info"); But the fields in the strings are messy and un-recognizeable. Phpdoc is far too cluttering. Declaring every possible option is pointless for some classes, especially if they are highly dynamic, like derived from a database table.Just forgot to mention one more readability advantage: It would support "nested" initializations, like it is now possible with arrays full of strings $object = new Object({ Property: $aValue, Property2: $aValue2, Subobject: new Object({ ... }) });I really hope we won't turn php into javascript :) Please take a look, the sugar you talk about is possible with the following class Props { function __construct(array $argv) { foreach($argv as $arg => $val) { $this->$arg = $val; } } } $u = new Props(['hello' => 'world', 'good' => 'bye', 'obj' => new Props(['my' => 'god'])]); Or even use func_get_args() to make $argv optional. However this is a VERY bad style. Every object property should be defined with the class.