[PHP]: utilizzare la funzione di ritorno come dati di array nella definizione della classe statica
-
17-09-2020 - |
Domanda
Sto avendo problemi con questa definizione di classe a causa della definizione di $directories
.Aiuto Aiuto:
<?php
.....
class Config {
public static $directories = array(
"resources" => realpath(__DIR__),
"root" => $_SERVER['DOCUMENT_ROOT'],
"branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch",
"templates" => realpath(__DIR__ . '/templates'),
"library" => realpath(__DIR__ . '/library'),
"views" => realpath(__DIR__ . '/views'),
"controllers" => realpath(__DIR__ . '/controllers'),
"backups" => realpath(__DIR__ . '/backups')
);
}
?>
. Soluzione
Non è possibile inizializzare i membri statici a qualcosa di diverso dai letterali diretti e le costanti già definite.Potresti usare qualcosa del genere però:
<?php
class Config
{
static protected $directories = null;
static public function getDirectory($dirName)
{
if (self::$directories == null)
{
self::$directories = array(
"resources" => realpath(__DIR__),
"root" => $_SERVER['DOCUMENT_ROOT'],
"branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch",
"templates" => realpath(__DIR__ . '/templates'),
"library" => realpath(__DIR__ . '/library'),
"views" => realpath(__DIR__ . '/views'),
"controllers" => realpath(__DIR__ . '/controllers'),
"backups" => realpath(__DIR__ . '/backups')
);
}
return self::$directories[$dirName];
}
}
#EOF
. Altri suggerimenti
Citazione dal manuale PHP:
.Questa dichiarazione [proprietà] può includere un'inizializzazione, ma questa L'inizializzazione deve essere una costante Valore - cioè, deve essere in grado di essere valutato a tempo di compilazione e non deve Dipende dalle informazioni di runtime in per essere valutato.
È possibile definire un array vuoto, quindi chiamare un metodo per popolarlo in runtime, o una classe singleton che inizializza i valori dell'array nel costruttore
Non è possibile chiamare le funzioni durante la dichiarazione delle variabili di classe / oggetto / costanti.Inoltre, non puoi usare la concatenazione delle stringhe.È piuttosto limitato.
Aggiornamento: Puoi usare la seguente soluzione alternativa (ci è voluto un po 'di tempo per scrivere), è un po' brutto perché richiede la definizione di costanti due volte:
<?php
define('CONFIG_DIRECTORY_RESOURCES', realpath(__DIR__));
define('CONFIG_DIRECTORY_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('CONFIG_DIRECTORY_BRANCH', $_SERVER['DOCUMENT_ROOT'] . '/branch');
define('CONFIG_DIRECTORY_TEMPLATES', CONFIG_DIRECTORY_RESOURCES . '/templates');
define('CONFIG_DIRECTORY_LIBRARY', CONFIG_DIRECTORY_RESOURCES . '/library');
define('CONFIG_DIRECTORY_VIEWS', CONFIG_DIRECTORY_RESOURCES . '/views');
define('CONFIG_DIRECTORY_CONTROLLERS', CONFIG_DIRECTORY_RESOURCES . '/controllers');
define('CONFIG_DIRECTORY_BACKUPS', CONFIG_DIRECTORY_RESOURCES . '/backups');
class Config
{
public static $directories = array(
"resources" => CONFIG_DIRECTORY_RESOURCES,
"root" => CONFIG_DIRECTORY_ROOT,
"branch" => CONFIG_DIRECTORY_BRANCH,
"templates" => CONFIG_DIRECTORY_TEMPLATES,
"library" => CONFIG_DIRECTORY_LIBRARY,
"views" => CONFIG_DIRECTORY_VIEWS,
"controllers" => CONFIG_DIRECTORY_CONTROLLERS,
"backups" => CONFIG_DIRECTORY_BACKUPS,
);
}
. Perché presentare il sovraccarico di un oggetto?I registri hanno il loro posto, ma questi sono i primi candidati per le costanti, quindi perché non solo definirli?