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
86
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
86
modificato 8 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda