Skip to content

0.15.1 — dwie paczki abilities na jednej witrynie kładły ją białą stroną

Latest

Choose a tag to compare

@NertiPL NertiPL released this 23 Aug 11:39

Fatal error: Cannot declare class ACFW_Pack, because the name is already in use

Rejestr ACFW_Pack był od początku pisany tak, żeby paczki się nim dzieliły — pierwsza deklaruje klasę, reszta ją zastaje — i miał na to strażnika if ( class_exists( 'ACFW_Pack' ) ) return;. Strażnik nie miał szansy zadziałać ani razu.

Klasa zadeklarowana bezwarunkowo na najwyższym poziomie pliku jest wiązana przez PHP na etapie kompilacji tego pliku (early binding), czyli zanim wykona się jakikolwiek kod w środku. Kiedy druga paczka kompilowała swój bootstrap.php, nazwa była już zajęta i PHP przerywało kompilację — do class_exists() nigdy nie dochodziło. Dlatego komunikat brzmi „Cannot declare class", a nie „Cannot redeclare class": to błąd kompilacji, nie wykonania.

Klasa zadeklarowana wewnątrz bloku if nie podlega early bindingowi — powstaje dopiero, gdy wykonanie do niej dojdzie. Dopiero wtedy strażnik cokolwiek znaczy.

Zmierzone 2026-08-23 na laboria.local, gdzie stoją trzy paczki z tym samym rejestrem. Na witrynie z jedną paczką usterka nie występuje, dlatego przeżyła do teraz.

Ta sama poprawka jest potrzebna w każdej innej paczce z tym rejestrem — dopóki którakolwiek deklaruje klasę bezwarunkowo, to ONA wywróci witrynę, kiedy skompiluje się jako druga.