Dan Ackroyd wrote:
> This looks to solve a problem very similar to the one solved by the
> 'Memoize' annotation in HHVM -
> https://docs.hhvm.com/hack/attributes/special#__memoize

> However the memoize functionality seems a lot clearer to me, as it's
> less 'magic'; it doesn't make accessing a variable actually call a
> function.

On really it seems a very good feature focused on method call.
Maybe it can be done in same idea, by freezing the first result of method.
But I think hard do that with args.

Maybe something like that: http://pastebin.com/YKjEYeYF
Note: I know that is better an IoC, understand just as example.



Dan Ackroyd wrote:
> This code has a circular dependency:
>
> class Foo {
>   public $a, $b;
>    public __construct() {
>        $this->a = lazy { return 1 + $this->b; }
>        $this->b = lazy { return 1 + $this->a; }
>    }
> }
>
> $foo = new Foo;
> echo $foo->a;
>
> $foo->a can't be resolved until $foo->b is resolved, and $foo->b can't
> be resolved until $foo->a is resolved.

Now back to topic, this circular dependency too occur with functions.
Basically if it happen, should throw a infinite recursion error.
(Currently I guess that PHP don't do that, but xdebug does)

In all case, $a should not depends of $b, when $b depends $a.
In this case, should have a bootstrap system, that turn it independent.

Example:

class Foo {
    public $a, $b;
    public __construct () {
        $c = lazy { return generalDependency(); }
        $this->a = lazy use ($c) { return 1 + $c; };
        $this->b = lazy use ($c) { return 1 + $c; };
    }
}



Dan Ackroyd wrote:
> Because the 'memoization' of functions is less magic, it is much less
> prone to this circular dependency problem.

I guess that memoization is another topic, but still very interesting,
as cited above.
So maybe it can be discussed apart of this email, if is reasonable.



Stanislav Malyshev wrote:
> > This Feature Request is about the implementation of lazy statements.
> >
> > Basically it should implements a 'lazy' keyword (or similar) and
> > structured like an anonymous function, except that it doesn't accepts
> > arguments, but accept the use() feature.
> >
> >     $var = lazy { return 1; }
>
> Is this just keystroke saving for function() or is this supposed to do
> something additional?

It's similar to function (), but should be applied to variables or
properties only.
But exists an important difference between you use lazy vs function ().

$var1 = function () { sleep(5); return 1; }
$var2 = lazy { sleep(5); return 1; }

- $var1 should be called like $var1();
- If I call $var1() five times, it'll execute this structure over 25 seconds;
- If I try to write over $var1(), possible I should get an error
trying to write over int (1);

- $var2 should be called like $var2 directly;
- If I call $var2 five times, it'll execute once the structure,
custing 5 seconds only;
- If I try to write over $var2 it'll, in fact, write over $var2
processed structure, that stores int (1);

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

Reply via email to