2015-02-15 21:04 GMT+02:00 Patrick Schaaf <p...@bof.de>:
> Hello Internals,
>
> seeing the static calling of instance methods being discussed again, I want
> to ask whether the following idea would maybe have a chance?
>
> In our codebase we have one set of classes where it was very useful to be
> able to call the same methods both statically and nonstatically: a set of
> wrapper classes over phpredis where subclasses "know" which set of redis
> servers to talk to (plus other config like retry strategies and timeouts).
> In most cases calling code does not need to be concerned with these details
> and just calls methods like red_global::get() or red_local::put().
>
> By neccessity the implementation of this class set, must make use of both
> __call() and __callStatic() magic methods, with both then dispatching to a
> delegate phpredis instance, and in the case of __callStatic(), making
> up-front a singleton like "new self" once. For a set of additional helper
> methods (not present on the underlying phpredis) I additionally have a
> special mapping array of real method names to internal implementation names.
>
> A similar approach can be useful for database connection abstraction
> classes.
>
> Now for the idea how this might be made much more simple: onviously in the
> light of the "static call to method using $this" warning/detection, PHP
> already knows exactly where it hits such a static call to an instance
> method. At that point, check whether the class has a "static instance"
> already. When it has one, call the method with $this being that "static
> instance". Otherwise, create the static instance, calling a new magick
> method named __constructStatic() to initialize it. Only classes that have
> such a __constructStatic() method, would be treated that way. For other
> classes the "static call to instance method" case would be an error as
> before/discussed.
>
> This approach would clearly simplify my redis wrapper classes, maybe even
> enable them to be proper subclasses of phpredis (saving an indirection to a
> $this->delegate object). All the special dispatch and __callStatic
> instantiation logic could go away.
>
> The cost would be one internal pointer (to the "static instance" object)
> per class, a kind of hidden "static protected" property, and only needed
> when the class (or one of its superclasses) _has_ a __constructStatic
> method in the first place.
>
> What do you all think? Interesting? Somebody hot for helping with
> impementation? Then I'd make an RFC of it.
>
> best regards
>   Patrick

+1

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to