Как написать или открыть массив php без оценки или расширения магической константы __DIR__

У меня есть файл конфигурации, который является массивом php с именем config.php.

return array(
    'template_dir' => __DIR__ '/configs/templates.php'
)

Тогда всякий раз, когда я хочу использовать этот файл конфигурации, я просто включаю config.php. Также очень легко написать файл конфигурации таким способом.

file_put_contents($config, 'return ' . var_export($data, true));

Но я хотел бы иметь возможность записать магическую константу DIR в файл конфигурации без ее расширения. До сих пор я не смог придумать способ сделать это. Я попробовал все, чтобы написать метод recursiveArrayReplace, чтобы удалить весь путь и пытается заменить его на

    __DIR__

но это всегда приходит как

    '__DIR__ . /configs/template.php'

Который в этом случае не будет расширяться, когда его запустить.

Как я могу написать

   __DIR__ to an array in a file or how ever else without the quotes so that it looks like,

array('template_dir' => __DIR__ . '/configs/templates.php');

3 ответа

Решение

Это невозможно, потому что var_export() печатает переменные, а не выражения.

Было бы лучше вместо этого записать все ваши пути в виде относительных каталогов и канонизировать их до полного рабочего пути после извлечения данных.

Вы также можете рассмотреть возможность возврата объекта:

class Config
{
    private $paths = array(
        'image_path' => '/configs/template.php',
    );

    public function __get($key)
    {
        return __DIR__ . $this->paths[$key];
    }
}

return new Config;

В качестве альтернативы, вам придется создавать код PHP самостоятельно.

Вместо того, чтобы заменить путь на __DIR__Вам также необходимо заменить начальный апостроф.

Например, если путь был /foo/bar тогда вы захотите сделать эту замену:

"'/foo/bar" в "__DIR__ . '"


До:

'/foo/bar/configs/template.php'

После:

__DIR__ . '/configs/template.php'

Как насчет написать конфигурацию напрямую:

$data = <<<EOT
return  array('template_dir' => __DIR__ . '/configs/templates.php');
EOT;

file_put_contents($config, $data);
Другие вопросы по тегам