1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Вставка перемнных в подключаемую функцию

Тема в разделе "Web Coding", создана пользователем finogeev, 2 авг 2007.

Статус темы:
Закрыта.
Модераторы: latteo
  1. finogeev

    finogeev Прохожие

    Что то я совсем уже схожу с ума ...
    Поскажите, ситуация такая.
    В php файл инклюдятся два файла, один с переменными (типа конфига), а другой с пользовательскими функциями, которые используют переменные из первого файла.

    как мне правильно сделать. В файле с функциями инклюдить нельзя, а постоянно передвать параметры при вызове финкции, типа

    UserFunc ($var1, $var2);

    как то не хочеться и слишком открыто
     
  2. difour

    difour Прохожие

    1ый файл
    Код:
    $db_name = 'aaa';
    $db_user = 'dsadas';
    
    2ой
    Код:
    function connect()
    {
      global $db_name, $db_user;
    }
    
    3их инклудит оба
     
  3. nnmkayf

    nnmkayf

    Регистр.:
    25 июл 2007
    Сообщения:
    153
    Симпатии:
    98
    АААA! Глобалы в современном коде... Народ так делать ненужно!!!
    Данная проблема решается с томощью ООП (Объектно Ориентированого Программирования)
    При инстансе класса просто передаем ему необходимые параметры через конструктор или с помощью сеттеров:
    Пример:
    PHP:
    <?
    class 
    Foo
    {
        var 
    $_bar;
        
    // Это конструктор для PHP4, работает и в пятерке
        
    function Foo($bar=null)
        {
            
    $this->_bar=$bar;
        }
        
    // Это сеттер 
        
    function setBar($bar)
        {
            
    $this->_bar=$bar;
        }
    }
    // использование 
    $fooObject = new Foo(); //тут получим пустую $this->_bar
    $fooObject->setBar("Zoo"); // тут получим $this->_bar = "Zoo"
    // того же результата можно достич передав Zoo в конструктор - делается это так
    $fooObject = new Foo("Zoo");
    ?>
    Возможен другой вариант используем паттерн Singletone, но это уже несколько другая история.
    p.s. Кстати если во втором инклюде только функции - он легко превращается в клас Functions если в начале дописать class Functions { и в конце }
    И вызов функций будет происходить так
    PHP:
    $functionsObject = new Functions();
    $result $functionsObject->название_функции(ее_параметры);
    p.s. Про паттерны типа Singletone можно почитать здесь Перейти по ссылке
    p.p.s. Кстати если нужен правильный пример Singleton`а заказывайте. В php4 есть маленький баг который нужно знать как обходит ь, чтобы не создавались копии синглтонов.
     
  4. Jameson

    Jameson Читатель

    Заблокирован
    Регистр.:
    25 июн 2007
    Сообщения:
    406
    Симпатии:
    92
    заказываем ;)

    вот что я вычитал:

    function &singleton($class) {
    static $instances;

    if (!is_array($instances)) {
    $instances = array();
    }

    if (!isset($instances[$class])) {
    $instances[$class] =& new $class;
    }

    return $instances[$class];
    }

    Использование:
    $class_instance =& singleton('Class');
     
  5. nnmkayf

    nnmkayf

    Регистр.:
    25 июл 2007
    Сообщения:
    153
    Симпатии:
    98
    Интересный вариант привел Jameson, толко это не синглтон, а скорее фабрика синглтонов. Точнее это похоже на паттерн Registry.
    Тем не менее, приведенный код решает ту проблему о которой я говорил. Конкретно php4, не позволяет в статическом методе возвращать по ссылке объект, он возвращает копию - это может привести к неприятным сюрпризам :(
    Мой вариант синглтона, с передачей параметров. Применение ему может быть разное, но лично я, в основном, использую его для конфигурации приложения.
    PHP:
    <?
    class 
    OurSingletone
    {
        var 
    $_config null;
     
    /**                                                        
         * &getInstance - получить синглтон, один на весь проект, при первом вызове необходимо передать параметр
         *
         * @static
         * @param string $config - наш абстрактный параметр
         * @access public
         * @return OurSingletone
         */
        
    function &getInstance($config null) {
            static 
    $instance null;
            if ( 
    is_null($instance) ) {
                
    $instance = array();
                
    $instance[0] = &new OurSingletone($config);
            }
            return 
    $instance[0];
        }
        function 
    OurSingletone($config)
        {
            
    $this->_config=$config;
        }
        
    /*
        Использование:
        первый раз передаем необходимые параметры
        */
        
    $singletone=&OurSingletone::GetInstance ('что-то наше');
        
    /*
        второй раз получаем тот же объект  но не используем параметр
        */
        
    $singletone=&OurSingletone::GetInstance();
    }    
    ?>
    p.s. Маленькое предупреждение, в проекте обычно требуется один-два синглтона, если у вас получается их больше скорее всего имеет место ошибка проектирования, конечно если проект не слишком большой.
     
Статус темы:
Закрыта.