CLI & Singleton fanno i capricci

Sono incappato in uno strano comportamento di php (CLI), ancora non capisco se è dovuto al mio codice o no, ma a quanto pare una Singleton non è una Singleton se il metodo getInstance viene chiamato in due file differenti.

A.php
require_once 'C.php';
class Singleton {
   ...
   public static getInstance() 
   {
      if (...) {
         echo 'ISTANZA CREATA';
         ...
       }
       ...
   }
   ...
}


Singleton::getInstance();
Singleton::getInstance();
C.php
require_once 'B.php';
...
B.php
Singleton::getInstance();

Produce:

ISTANZA CREATA
ISTANZA CREATA

 ???

inviato 8 anni fa
Andrea Turso
Andrea Turso
96
modificato 8 anni fa
X 0 X

Bah, a quanto pare il problema è nel codice, assurdo.

Ecco la prova che il problema non è di PHP (infatti, mi pareva abbastanza strano).

A.php

<?php
require_once 'b.php';
class Singleton
{
    static $instance;
    
    public static function getInstance($caller)
    {
        if (self::$instance == null) {
            self::$instance = new self($caller);
        }
        echo "{$caller} ha chiesto di un'istanza Singleton" . PHP_EOL;
        return self::$instance;
    }
    protected function __construct($caller)
    {
        echo "{$caller} ha creato un'istanza Singleton" . PHP_EOL;
    }
}
Singleton::getInstance("a");
Singleton::getInstance("a");

B.php

<?php
require_once 'c.php';
Singleton::getInstance("b");
Singleton::getInstance("b");

C.php

<?php
Singleton::getInstance("c");
Singleton::getInstance("c");
~$php a.php
    c ha creato un'istanza Singleton
    c ha chiesto di un'istanza Singleton
    c ha chiesto di un'istanza Singleton
    b ha chiesto di un'istanza Singleton
    b ha chiesto di un'istanza Singleton
    a ha chiesto di un'istanza Singleton
    a ha chiesto di un'istanza Singleton

Ora si va di debug. Dannazione.

risposto 8 anni fa
Andrea Turso
Andrea Turso
96
modificato 8 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda