«Пространство имен», константа и множественный PHP включает в себя

голоса
2

У меня есть PHP-код, подобный следующему:

foreach ($settingsarray as $settingsfile)
{
    include ($settingsfile);
    // do stuff here
}

$ Settingsarray массив имен файлов из определенной папки.

Проблема заключается в том, что каждый $ SettingsFile определяет константы (с теми же именами), которые, конечно, не могут быть переопределены.

Какие возможные методы существуют, чтобы предотвратить ошибки, возникающие в этой ситуации?

Два варианта я могу думать о том, включает, изменение всех констант переменные и с помощью PHP пространств имен.

Тем не менее, я не знаю, как я бы идти об использовании пространств имен, то потребуется заявление в начале каждого $ SettingsFile? Есть ли способ выделения констант, ariables и функции без использования пространств имен?

То, что я действительно люблю, чтобы быть в состоянии сделать что-то же просто, как:

foreach ($settingsarray as $settingsfile)
{
    {//added braces to indicate where the isolation is
        include ($settingsfile);
        // do stuff here
    }//what happens in here does not affect what happens outside of here
}

Я просто должен отметить, что это часть новой функции, и это только часть кода, который загружает все $ settingsfiles. Остальная часть кода только когда-либо загружает один файл за раз. Одна из причин, я использую константы так, что я не придется беспокоиться об определении переменных «глобальной», чтобы иметь возможность доступа к ним внутри функции.

Задан 19/05/2009 в 11:55
источник пользователем
На других языках...                            


5 ответов

голоса
1

Итак, если я правильно понять вас, внутри этого цикла вы хотите сделать что - то с константами , определенными внутри каждого , $settingsfileа затем в основном избавиться от них после каждого цикла?

В отличие от переменных, константы является значение, после того , как установлено, не может быть изменен или отключенное во время выполнения вашего скрипта ЦСИ

Единственным вариантом является изменение define()объявления переменных.

Ответил 19/05/2009 в 12:00
источник пользователем

голоса
1

не легко, но вы можете прочитать файл РНР с file_get_contents ($ SettingsFile), а затем переписать константы и Eval код.

$settingsstr = file_get_contents($settingsfile);
$settingsstr = preg_replace('/<\?\w*(.*)/', '\\1', $settingsstr);//get rid of the php open tag
$settingsstr = preg_replace('/define\("(\w+)"/', 'define("NAMESPACE_\\1"', $settingsstr);
eval($settingsstr);
Ответил 19/05/2009 в 12:30
источник пользователем

голоса
1

У вас есть несколько вариантов:

Использование PHP Пространства имен

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

Использование класса Константы

Вы можете использовать классы и константу класса для загрузки настроек. Константы класса являются локальными по отношению к определяющему класс, так что вам не нужно будет беспокоиться о столкновении имен внутри класса. Вы , вероятно , нужно будет делать больше , чем включить файл, но вы можете вызвать метод каждого класса, такие как defineConstants () или loadConfiguration () , который будет определять константы приложения, сохраняя константы класса для внутреннего использования.

Использование функций для расширения параметров

Другая идея состоит в том, чтобы создать массив параметров и отдельные функции для «Перенести» эти параметры. Таким образом, вы можете переписана любую конфигурацию в последующих функциях, не вызывая ошибку. И, наконец, если вы хотите поместить те константы, вы можете перебирает массив и использовать определение () для определения констант.

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

Ответил 19/05/2009 в 12:30
источник пользователем

голоса
0

Файл настройки не должен Contan PHP кода. Это должно быть своего рода «стандартного» формата. http://www.php.net/parse_ini_file

  • На первом этапе (в вашем Еогеаспе) вы читаете все файлы
  • Сбор переменных во временный массив
  • В другом цикле над этим массивом, вы можете определить их как константы.

Если вы обычно чувствуете необходимость «переопределять константы», то что-то амишей в разработке приложений.

Ответил 19/05/2009 в 12:54
источник пользователем

голоса
4

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

Если вы можете использовать пространство имен, я предполагаю, что вы уже перешли на PHP 5.3RC2. Скопируйте следующий код в файл .php, а также изменить пространство имен по своему вкусу:

<?php
namespace myapp\config;

function define($key, $val) {
    Config::set($key, $val);
}

class Config {
    private $vars = array();

    // This class should not be instantiated
    private function __construct() {}

    public function set($key, $val) {
        self::$vars[$key] = $val;
    }

    public function get($key) {
        return isset(self::$vars[$key]) ? self::$vars[$key] : NULL;
    }
}

?>

Включите, что в вашем коде, и теперь делает все работы простой вопрос об изменении

<?php

в настройках файлов для

<?php namespace myapp\config;

Если у вас есть тонна из них, команда быстро «СЭД» в вашем терминале должен заботиться о нем довольно хорошо, все одним махом.

Если бы я потерял вас о том, как использовать мой код, вот пример:

<?php
require_once('the_php_file_i_just_gave_you.php');
use \myapp\config\Config;

foreach ($settingsarray as $settingsfile) {
    include ($settingsfile);
    $varname = 'key';
    echo "In this file, '$varname' equals: " . Config::get($varname);
}

?>

Удачи!

Ответил 19/05/2009 в 17:34
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more