2014-01-08 4 views
1

У меня следующие два файла: сначала для параметров конфигурации, а второй содержит некоторые функции. Когда я пытаюсь получить переменную из config.php в functions.php тогда я получаю сообщение об ошибке:PHP Замечание: Неопределенная переменная при включении другого файла и получении переменной из него в функции

Notice: Undefined variable: config in /var/www/app/functions.php on line 15

Config в файле config.php

$config = array('page_title' => 'Page Title'); 

functions.php Файл

require_once 'config.php'; 

function get_header() { 
    $header = new Template('header'); 
    $header->set('pagetitle', $config['page_title']); 
    echo $header->output(); 
} 

Когда я попытался для правильной работы переменной конфигурации внутри функции. Почему я могу сделать это по-своему?

ответ

2
function get_header() { 

    global $config; 

    $header = new Template('header'); 
    $header->set('pagetitle', $config['page_title']); 
    echo $header->output(); 
} 

В основном, вы используете глобальную переменную в локальном контексте.

Было бы неплохо инкапсулировать конфигурацию в каком-то классе конфигурации с помощью singleton, поэтому конфигурация не будет перезаписана ничем.

Чтобы быть полностью совместимым с почти хорошей практикой объектно-ориентированного программирования;)

class Config { 

protected $data; 

public function __construct(array $config) { 

    $this->data = $config; 

} 

public function get($key) { 

    return $this->data['key']; 

} 

} 


class ConfigManager { 

public static $configs; 

// In "good OOP" this should't be static. ConfigManager instance should be created in some kind of initialisation (bootstrap) process, and passed on to the Controller of some sort 
public static function get($configName) { 

    if(! isset(self::$configs[$configName])) 
    self::$configs[$configName] = new Config(include('configs/' . $configName. '.php')); // in good OOP this should be moved to some ConfigReader service with checking for file existence etc 

    return self::$configs[$configName]; 

} 

} 

, а затем в configs/templates.php

return array('page_title' => 'Page Title'); 

ваша функция будет выглядеть следующим образом:

function get_header() { 

    $config = ConfigManager::get('templates'); 

    $header = new Template('header'); 
    $header->set('pagetitle', $config->get('page_title')); 
    echo $header->output(); 
} 

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

Использование глобалов не является одним из них!

2

Вы ВНУТРИ функции.

Вы можете поместить $ config в качестве глобального или вам нужно передать его функции, чтобы иметь данные.

1

Вы работаете внутри функции, которая всегда сложна.

function get_header() { 
global $config; //this will fix it 
$header = new Template('header'); 
$header->set('pagetitle', $config['page_title']); 
echo $header->output(); 
} 
Смежные вопросы