Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Magic property access skips __get() when another Fiber is suspended in __get() on the same object

Aberta
#23,075 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
48/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Pouca atividade
Stack de tecnologia
php
Domínio
compilers

Direção de pesquisa

Comece com a reprodução fornecida de fiber-magic-get.php e execute-a com php -n; em seguida, compare as saídas reais e esperadas. Investigue a proteção contra recursão de propriedades sobrecarregadas entre os dois Fibers que compartilham o objeto, incluindo os casos relacionados a __isset() e à coalescência de null; considera-se concluído quando ambos os acessos independentes invocam seus handlers e retornam os valores esperados.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Bug Category: Fibers Status: Verified
Description
Description

When two Fibers access the same undefined property on the same object, and the
first Fiber suspends inside __get(), the second Fiber does not invoke
__get().

Instead, PHP emits an "Undefined property" warning and returns null.
After the first Fiber is resumed, its property access returns the correct value.

The access from the second Fiber is not a recursive property access. It is an
independent access with its own Fiber execution stack.

The issue reproduces with php -n, without loading a php.ini or third-party
extensions.

Steps to reproduce

Save the following script as fiber-magic-get.php:

<?php

declare(strict_types=1);

final class YieldingProperty
{
    public function __get(string $name): int
    {
        Fiber::suspend();
        return 8;
    }
}

$value = new YieldingProperty();

$first = new Fiber(static function () use ($value): void {
    var_dump($value->property);
});

$second = new Fiber(static function () use ($value): void {
    var_dump($value->property);
});

$first->start();
$second->start();
$first->resume();

Run it without loading configuration or extensions:

php -n fiber-magic-get.php
Actual result
Warning: Undefined property: YieldingProperty::$property ...
NULL
int(8)

__get() is skipped for the second Fiber and the property access returns
null.

Expected result
int(8)
int(8)

Both property accesses should invoke __get() independently and return 8.

Suspending one Fiber inside __get() should not make an access from another
Fiber appear recursive.

Reproducibility

Always reproducible.

Tested with:

  • PHP 8.3.33 CLI on Linux, using php -n
  • PHP 8.4.7 CLI on Windows, using php -n
Additional information

The issue only occurs when the Fibers share the same object.

The following controls do not fail:

  • Giving each Fiber its own object
  • Replacing the magic property access with a normal method call on the shared
    object

The same problem also affects __isset() and null-coalescing property
expressions such as:

$value = $object->property ?? 0;

Under contention, these expressions can silently return the fallback value
even though __isset() returns true and __get() returns the expected value.

This behavior suggests that the recursion guard for overloaded properties is
associated with the shared object and remains visible to other Fibers while a
magic property handler is suspended.

PHP Version
PHP 8.3.33 (cli) (built: Jul 31 2026 12:56:07) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.33, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.33, Copyright (c), by Zend Technologies

PHP 8.4.7 (cli) (built: May  6 2025 14:12:45) (ZTS Visual C++ 2022 x64)
Copyright (c) The PHP Group
Zend Engine v4.4.7, Copyright (c) Zend Technologies
Operating System

Windows 11, Plesk Linux ... 6.8.0-111-generic #111-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 11 23:16:02 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux

Linguagem predominante
C
Estrelas
40.4k
Forks
8.2k
Merge médio
2d 10h
PRs com merge (30d)
118

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de php/php-src

Todas as issues de php/php-src

Issues semelhantes

Mais issues de C

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.