Re: static type-references
| From: | Etienne Kneuss | Date: | Thu, 14 Mar 2013 16:42:34 +0000 |
| Subject: | Re: static type-references | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-66619@lists.php.net to get a copy of this message | ||
Dear Rasmus,
On Thu, Mar 14, 2013 at 5:26 PM, Rasmus Schultz <rasmus@mindplay.dk> wrote:
> Hey List,
>
> What do you think about adding a typeof() operator to PHP?
>
> It could go something like this:
>
> class User
> {
> public $name;
> }
>
> /**
> * @var ReflectionClass $user_type
> * @var ReflectionProperty $user_name_property
> */
>
> $user_type = typeof(User);
>
> $user_name_property = typeof(User::$name);
>
> Mind you, this is an operator and not a function - User and User::$name are
> interpreted as symbols.
>
> This would allow for static analysis of class and property-references.
>
> Why? Because you can't use static analysis on code like this:
>
> $user_type = new ReflectionClass('User');
>
> $user_name_property = new ReflectionProperty('User', 'name');
>
> 'User' and 'name' are just strings, and strings are dead matter when it
> comes to static analysis.
>
It is certainly possible for static analyses to reason about literal
strings. Handling reflective code is not that hard when its arguments are
literals.
>
> Most form builders and ORMs (and other reflective meta-programming
> components) require references to properties or classes, e.g.:
>
> $form->textInputFor($user, 'name');
>
> There is no knowledge that 'name' actually refers to the symbol User::$name
> and hence to way to perform static analysis or use refactoring tools on
> this code.
>
> Compare to:
>
> $form->textInputFor($user, typeof(User::$name));
>
To me this code makes no sense. I expect typeof to return a type, since we
have no first-class types in PHP, I expect it to return a string
representing the type.
If I understand your example, here it returns a Reflection* ?
What about typeof($a->b) or even typeof($a->$foo) ? I assume both of them
would be forbidden ?
> This code can be analyzed and refactored, because the reference to the
> User::$name property is now literal.
>
>
Difficulty to statically analyze code comes from its dynamic nature, to me
typeOf(User::$name) is no less dynamic than new ReflectionProperty("User",
"name").
> Actually having to type out typeof() may not be the most elegant approach,
> and using this syntax it does resemble a function - having a more distinct
> syntax might be better.
>
> But those things aside, what do you think about having a way to statically
> reference types and members?
> Thanks,
> Rasmus Schultz
>
--
Etienne Kneuss