2017 © Pedro Peláez
 

library once

A magic memoization function

image

spatie/once

A magic memoization function

  • Wednesday, January 31, 2018
  • by Spatie
  • Repository
  • 8 Watchers
  • 188 Stars
  • 14,733 Installations
  • PHP
  • 2 Dependents
  • 0 Suggesters
  • 14 Forks
  • 1 Open issues
  • 17 Versions
  • 61 % Grown

The README.md

Social Card of Once, (*1)

A magic memoization function

Latest Version on Packagist Software License Build Status Quality Score StyleCI Total Downloads, (*2)

This package contains a once function. You can pass a callable to it. Here's quick example:, (*3)

$myClass = new class() {
    public function getNumber(): int
    {
        return once(function () {
            return rand(1, 10000);
        });
    }
};

No matter how many times you run $myClass->getNumber() inside the same request you'll always get the same number., (*4)

Are you a visual learner?

Under the hood, this package uses a PHP 8 Weakmap. In this video, you'll see what a weakmap is, together with a nice demo of the package., (*5)

Support us

, (*6)

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products., (*7)

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall., (*8)

Installation

You can install the package via composer:, (*9)

``` bash composer require spatie/once, (*10)


## Usage The `once` function accepts a `callable`. ```php $myClass = new class() { public function getNumber(): int { return once(function () { return rand(1, 10000); }); } };

No matter how many times you run $myClass->getNumber() you'll always get the same number., (*11)

The once function will only run once per combination of argument values the containing method receives., (*12)

class MyClass
{
    /**
     * It also works in static context!
     */
    public static function getNumberForLetter($letter)
    {
        return once(function () use ($letter) {
            return $letter . rand(1, 10000000);
        });
    }
}

So calling MyClass::getNumberForLetter('A') will always return the same result, but calling MyClass::getNumberForLetter('B') will return something else., (*13)

Flushing the cache

To flush the entire cache you can call:, (*14)

Spatie\Once\Cache::getInstance()->flush();

Disabling the cache

In your tests you probably don't want to cache values. To disable the cache you can call:, (*15)

Spatie\Once\Cache::getInstance()->disable();

You can re-enable the cache with, (*16)

Spatie\Once\Cache::getInstance()->enable();

Octane compatibility

Warning, (*17)

This behaviour is in beta and needs to be tested by the community. You can find this topic in discussion #79., (*18)

In order to have once working properly in an Octane environment, Cache::getInstance()->flush() must be called when OperationTerminated event is triggered. You can configure it in config/octane.php file:, (*19)

// config/octane.php

OperationTerminated::class => [
    FlushTemporaryContainerInstances::class,
    // DisconnectFromDatabases::class,
    // CollectGarbage::class,

    FlushSpatieOnce::class, // we should create this class we have added here
],

And create the FlushSpatieOnce:class:, (*20)

// app/Listeners/FlushSpatieOnce.php

use Spatie\Once\Cache;

class FlushSpatieOnce
{
    public function handle($event)
    {
        Cache::getInstance()->flush();
    }
}

Under the hood

The once function will execute the given callable and save the result in the $values property of Spatie\Once\Cache. This class is a singleton. When we detect that once has already run before, we're just going to return the value stored inside the $values weakmap instead of executing the callable again., (*21)

The first thing it does is calling debug_backtrace. We'll use the output to determine in which function and class once is called and to get access to the object that function is running in. Yeah, we're already in voodoo-land. The output of the debug_backtrace is passed to a new instance of Backtrace. That class is just a simple wrapper, so we can work more easily with the backtrace., (*22)

$trace = debug_backtrace(
    DEBUG_BACKTRACE_PROVIDE_OBJECT, 2
)[1];

$backtrace = new Backtrace($trace);

$object = $backtrace->getObject();

Next, we calculate a hash of the backtrace. This hash will be unique per function once was called in and the values of the arguments that function receives., (*23)

$hash = $backtrace->getHash();

Finally, we will check if there's already a value stored for the given hash. If not, then execute the given $callback and store the result in the weakmap of Spatie\Once\Cache. In the other case, we just return the value from that cache (the $callback isn't executed)., (*24)

public function has(object $object, string $backtraceHash): bool
{
    if (! isset($this->values[$object])) {

        return false;
    }

    return array_key_exists($backtraceHash, $this->values[$object]);
}

Changelog

Please see CHANGELOG for more information what has changed recently., (*25)

Testing

bash composer test, (*26)

Contributing

Please see CONTRIBUTING for details., (*27)

Security

If you've found a bug regarding security please mail security@spatie.be instead of using the issue tracker., (*28)

Credits

And a special thanks to Caneco for the logo ✨, (*29)

Credit for the idea of the once function goes to Taylor Otwell. The code for this package is based upon the code he was kind enough to share with us., (*30)

License

The MIT License (MIT). Please see License File for more information., (*31)

The Versions

31/01 2018

dev-master

9999999-dev https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

2.0.1

2.0.1.0 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

dev-handle-serialization

dev-handle-serialization https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

dev-analysis-qB2aN6

dev-analysis-qB2aN6 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

2.0.0

2.0.0.0 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

v2.x-dev

2.9999999.9999999.9999999-dev https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

dev-analysis-zEmNDm

dev-analysis-zEmNDm https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

dev-analysis-q5opKy

dev-analysis-q5opKy https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

dev-analysis-XVN3jw

dev-analysis-XVN3jw https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

31/01 2018

dev-analysis-XalbQx

dev-analysis-XalbQx https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

24/08 2017

1.1.0

1.1.0.0 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

14/11 2016

1.0.1

1.0.1.0 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

07/11 2016

1.0.0

1.0.0.0 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

07/11 2016

dev-analysis-8KRbnD

dev-analysis-8KRbnD https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

07/11 2016

dev-analysis-z49N5N

dev-analysis-z49N5N https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

cache callable spatie once memozation

06/11 2016

0.0.1

0.0.1.0 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

spatie once

06/11 2016

dev-analysis-8bOdb5

dev-analysis-8bOdb5 https://github.com/spatie/once

A magic memoization function

  Sources   Download

MIT

The Requires

  • php ^7.0

 

The Development Requires

spatie once