Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Proxy of a namespaced class extending a global class references the parent unqualified (Class "Ns\ArrayObject" not found)

Closed
#759 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@lisachenko is already working on this.

Since Oct 9, 2026.

  • #762 by @lisachenko — open

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
62/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
php
Domain
tooling

Research direction

Start with ClassGenerator::classNameNode() in src/Proxy/Generator/ClassGenerator.php, which only emits a fully qualified name when there is a leading backslash or a namespace separator, then trace the parent name passed from src/Proxy/ClassProxyGenerator.php around line 187. Reproduce with a namespaced class extending \ArrayObject and check that the generated proxy loads. Done when the extends clause and trait names are always fully qualified and the fixture and snapshot tests pass.

Written by the indexing model from the issue text.

Description

Bug

Problem

A woven class in a namespace that extends a class from the global namespace gets a proxy whose extends clause names the parent unqualified. The name then resolves inside the proxy's namespace, and including the proxy fails. This affects any extends \Exception, \RuntimeException, \ArrayObject, \DateTimeImmutable, and so on.

Reproduce (master 4e95fdd)

// app/Coll.php
namespace Bug2;
class Coll extends \ArrayObject implements \Countable
{
    public function hello(): string { return 'coll'; }
}

The aspect is #[Before('execution(public Bug2\**->hello(*))')]. The kernel uses appDir = app/; debug mode makes no difference.

Generated proxy (cache/Coll.php):

namespace Bug2;
// …
class Coll extends ArrayObject implements \IteratorAggregate, \Traversable, \ArrayAccess, \Serializable, \Countable, \Go\Aop\Proxy

Result: Error: Class "Bug2\ArrayObject" not found in cache/Coll.php:9 when the woven file includes the proxy.

Cause

  • src/Proxy/ClassProxyGenerator.php:187 passes $parentClass->getName() (ArrayObject, with no leading \) to ClassGenerator.
  • ClassGenerator::classNameNode() (src/Proxy/Generator/ClassGenerator.php:127-134) only emits Name\FullyQualified when the name has a leading \ or contains a namespace separator. A global class name therefore becomes a relative Name.
  • Interfaces are not affected, because they are prefixed with \ explicitly (ClassProxyGenerator.php:180).
  • Used traits (ClassGenerator.php:176,184) go through the same classNameNode(), so a trait declared in the global namespace is probably affected the same way.

Expected

extends \ArrayObject. Reflection always returns fully qualified names, so the parent (and the trait names) should always be emitted fully qualified. This also applies to the enum and trait proxy generators, if they pass reflection names through the same helper.

Acceptance

  • Weaving fixture and snapshot test: a namespaced class extending a global class (\ArrayObject or \Exception), and a class using a trait from the global namespace.
  • A functional or compile check that the generated proxy loads.
  • Generated code stays clean: the short-alias rules from AGENTS.md apply. A global name written as \ArrayObject is fine.
Dominant language
PHP
Stars
1.7k
Forks
166
Avg merge
11h 20m
Merged PRs (30d)
37

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from goaop/framework

All issues in goaop/framework

Similar issues

More PHP issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.