# RFC: weakrefs

- Status: Implemented (PHP 7.4)
- Authors: krakjoe
- Date: 2018-05-17
- Version: 0.1
- Original: https://wiki.php.net/rfc/weakrefs
- Page: https://externals.io/rfc/weakrefs
- More for agents: search with https://externals.io/search.md?q={query} · RFCs at https://externals.io/rfc.md · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

## Votes

### Implement weakrefs ? (closed)

Yes: 28 · No: 5

Voters: ajf (Yes), ashnazg (Yes), bishop (Yes), bwoebi (Yes), carusogabriel (Yes), cmb (Yes), cpriest (Yes), derick (No), diegopires (Yes), duncan3dc (Yes), emir (Yes), galvao (Yes), gasolwu (Yes), hywan (Yes), jhdxr (Yes), kalle (Yes), kguest (Yes), krakjoe (Yes), laruence (No), lex (Yes), lstrojny (Yes), malukenho (Yes), mike (Yes), nikic (Yes), ocramius (No), pauloelr (Yes), petk (Yes), pollita (No), ramsey (Yes), rasmus (Yes), rtheunissen (Yes), sebastian (No), trowski (Yes)

## Discussions on the mailing list

- [RFC WeakRefs](https://externals.io/message/102111.md) — started on 2018-05-17, 9 messages
- [RFC Weakrefs](https://externals.io/message/104014.md) — started on 2019-02-02, 20 messages
- [\[RFC\]\[Vote\] Weakrefs](https://externals.io/message/104500.md) — started on 2019-02-22, 3 messages

---

## Introduction

Weak References allow the programmer to retain a reference to an object which does not prevent the object from being destroyed; They are useful for implementing cache like structures. They are currently supported in PHP by extension.

The current implementations of WeakRef all work by overloading object handlers, the most popular implementation ([pecl-weakref](https://github.com/colder/php-weakref)) changes stack allocated read only memory and will be rendered unusable by PHP 7.3. Other implementations that change object handlers in some other way also risk faulting and rely on undefined behaviour and casting away constness.

Other implementations are possible, [krakjoe/uref](https://github.com/krakjoe/uref) is an implementation that uses low level features (mprotect, 0xCC, signals) to implement weakrefs, but at the cost of portability, generating segfaults, protecting memory, and implicit signal handler restrictions.

In principle weak referencing an object is not complicated, and only requires the (ab)use of Zend or layers beneath because we do not directly support it.

## Proposal

We directly support weak referencing in the simplest possible way.

## API

The proposed API:

```php
final class WeakReference {
    public static function create(object $object) : WeakReference;
 
    public function get() : ?object;
}
```

The proposed API differs from the documented [WeakRef](http://docs.php.net/class.weakref) class. The currently documented API includes the following methods omitted from the proposed API:

- valid
- acquire
- release

Acquire and release are sugar for get and unset, and valid is simply superfluous since the get method will not throw an exception and null is a falsy value.

## Implementation Details

The proposed API:

- is closed
- does not support serialization
- does not support properties

## Backward Incompatible Changes

None

## Proposed PHP Version(s)

PHP 7.4

## RFC Impact

### To SAPIs

None

### To Existing Extensions

None

### To Opcache

None

### New Constants

None

### php.ini Defaults

None

## Open Issues

None

## Unaffected PHP Functionality

All

## Proposed Voting Choices

Simple Yes/No, requires super majority.

**Vote: Implement weakrefs ?** — Yes: 28 · No: 5 (closed)

Voting started 2019-02-22, ends 2019-03-08.

## Patches and Tests

<https://github.com/php/php-src/pull/3787>

## References

Announce: <https://externals.io/message/102111>

Re-announce: <https://externals.io/message/104014>
