[PHP]: Use la función de devolución de la función como datos de matriz en la definición de clase estática
-
17-09-2020 - |
Pregunta
Tengo problemas con esta definición de clase debido a la definición de $directories
.Por favor ayuda:
<?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')
);
}
?>
Solución
No se puede inicializar a los miembros estáticos a cualquier cosa que no sea literales directos y las constantes ya definidas.Aunque podrías usar algo como esto:
<?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
Otros consejos
citando desde el manual PHP:
Esta declaración [propiedad] puede incluir una inicialización, pero esto La inicialización debe ser una constante Valor - es decir, debe ser capaz de ser evaluado en el tiempo de compilación y no debe Depende de la información de tiempo de ejecución en Para ser evaluado.
Podría definir una matriz vacía, y luego llamar a un método para rellenarlo en tiempo de ejecución, o una clase de singleton que inicializa los valores de la matriz en el constructor
No se puede llamar a funciones al declarar variables / constantes de clase / objeto.Tampoco puedes usar una concatenación de cadena.Es bastante limitado.
Actualización: Puede usar la siguiente solución (tardó un poco de tiempo para escribir), es un poco feo porque requiere definir constantes dos veces:
<?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,
);
}
¿Por qué introducir la sobrecarga de un objeto?Los registros tienen su lugar, pero estos son candidatos principales para constantes, así que ¿por qué no solo definirlos?