Come lavorare con le proprietà statiche [chiuso]

1

Come dichiarare la funzione statica con array e passare successivamente in un'altra classe?

class A
{
    //static
    public static $data = ['Los Angeles', 'New York', 'Washington'];
    //const
    const DATA = ['Los Angeles', 'New York', 'Washington'];
}

Quale approccio è migliore e perché? Forse per string o int è meglio un altro approccio? Quale? Non voglio cambiare questi valori.

Vorrei usare questo array in un'altra classe:

class B
{
    public function method()
    {
        $data1 = A::$data;
        $data2 = A::DATA;
    }
}

Ma questo è l'approccio corretto nella programmazione orientata agli oggetti?

In questo caso, la classe B non sa che usa la classe A, quindi forse la classe A dovrebbe essere passata nel metodo, ma forse questo approccio non si applica quando si tratta di metodi statici?

    
posta dazad 17.12.2017 - 11:36
fonte

2 risposte

1

Ci sono due domande qui:

1).

Per prima cosa, blocchiamo la principale differenza tra i due: La variabile public static $data può essere modificata in qualsiasi momento dopo la sua inizializzazione (anche dall'esterno della classe). const DATA non:

class B {
  public function method() {
    A::$data = ['Berlin']; // OK
    A::DATA = ['Berlin'];  // Error
  }
}

Se il valore non deve essere modificato dopo l'inializzazione, deve essere utilizzata la parola chiave const . Per quanto riguarda il tipo di valore, non c'è differenza tra i due.

(A proposito, è meglio usare i metodi getter / setter invece delle variabili pubbliche.)

2).

Un'interpretazione rigorosa della filosofia orientata agli oggetti potrebbe essere che non esistono variabili / metodi statici: sono consentite solo le istanze di classi, che vengono passate come parametri. Ma questo non è praticabile nel mondo reale. Non c'è niente di sbagliato nell'usare A::DATA all'interno di altre classi.

Inoltre, PHP non ha alcun concetto di variabili finali di istanza come altri linguaggi di programmazione. Un private const sarà sempre a livello di classe ...

    
risposta data 17.12.2017 - 20:59
fonte
0

Esporre la costante potrebbe andare bene fino a quando non sarà necessario un certo comportamento. Quindi questo comportamento molto probabilmente sarà implementato in una classe client, invece di dove dovrebbe essere - in una classe Cities . Le persone sono generalmente pigre, quindi è meglio iniziare con l'approccio giusto fin dall'inizio. Il tuo comportamento sarà incapsulato in un oggetto e potrai modificarlo con i decoratori. I semplici dati non sono componibili e la loro esposizione significa essere procedurali. Quindi ecco come potrebbe apparire:

interface Cities
{
    public function list();
}

class DefaultCities implements Cities
{
    public function list()
    {
        return ['Los Angeles', 'New York', 'Washington', 'London', 'Paris'];
    }
}

class AmericanCities implements Cities
{
    private $cities;
    private $dictionary;

    public function __construct(AmericanCitiesDictionary $dictionary, Cities $cities)
    {
        $this->dictionary = $dictionary;
        $this->cities = $cities;
    }

    public function list()
    {
        return
            array_filter(
                $this->cities->list(),
                function ($city) {
                    return $this->dictionary->exist($city);
                }
            );
    }
}
    
risposta data 18.12.2017 - 07:54
fonte

Leggi altre domande sui tag