Обработка глобальных переменных между различными классами и функциями в PHP - PullRequest
1 голос
/ 18 января 2012

Каков наилучший способ сделать переменную доступной для всех классов.

Например, я хочу иметь файл конфигурации (назовите его config.php), который будет иметь переменную, например, так:

$server_url = "www.myaddress.com";

И у меня есть файл основного типа библиотеки, который содержит набор классов, которым требуется доступ к $ server_url.Итак, начинается этот основной файл библиотеки:

require 'config.php';

class one {
  function a() {
          $html = "<a href='$server_url/main.php'>LINK</a>"
         return $html;
         } 

  function b() {
        $html = "<a href='$server_url/about.php'>LINK</a>"
        return $html;

         }
}


class two {

    function new() {
          $html = "<a href='$server_url/blah.php'>LINK</a>

     } 
}

Как лучше всего сделать $ server_url из config.php доступным для каждой функции?Или хотя бы доступны для всех функций в классе?

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Лично я бы использовал статический объект для хранения всех значений конфигурации.

Обычно большинство приложений php имеют одну точку входа (index.php), которая может загрузить файл config.php и сделать статическийобъект, доступный с этой точки.

Если ваше приложение имеет несколько точек входа, то вам нужно будет включить config.php в каждую из этих точек.

Что-то вроде этого:

<?php
    class Configurator{
        private static $_configuration = array();
        public static function write($key, $value) {
            self::$_configuration[$key] = $value;
        }
        public static function read($key) {
            return self::$_configuration[$key];
        }
    }
    Configurator::write('server', 'http://localhost');
    Configurator::read('server');
 ?>

CakePHP имеет аналогичный класс: http://api.cakephp.org/view_source/configure/

1 голос
/ 18 января 2012

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

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

<?php

class st {
    static $_this;


    function __construct(){
        self::$_this = $this;
    }

    static function &getInstance(){
        return self::$_this
    }

    static function set($key, $value){
        self::$_this[$key] = $value;
    }

    static function &get($key){
        return self::$_this[$key];
    }
}

// Usage

new st();

st::set('foo', 'bar');

// In some class
st::get('foo'); //return 'bar'

// Or when there are some classes/objects
st::getInstance()->foo->bar();
$st =& st::getInstance();
$st->foo->bar();
?>

Грубо записал небольшой синглтон, но не знаю, есть ли синтаксическая ошибка.

При работе с getInstance вы определите переменную по ссылке =&

1 голос
/ 18 января 2012

Сконфигурируйте конфиг в сам по себе класс и используйте статические методы вдоль линии serverUrl() или get('server_url'). Затем вызовите их как любые другие статические методы для классов (я выберу последний в этом примере):

$html = "<a href='" . Config::get ('server_url') . "/main.php'>LINK</a>";

Класс config может быть довольно тонким, используйте конструктор вроде:

public function __construct (array $config)
{
  foreach ($config as $key => $value)
  {
    $this->$key = $value;
  }
}

И добавьте метод get() следующим образом:

public function get ($key)
{
  return $this->$key;
}

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

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

Пожалуйста, не копируйте дословно код, он написан в качестве примера.

0 голосов
/ 19 января 2012

Определить константу в config.php следующим образом:

define ('SERVER_URL', '...');

В вашем классе:

echo SERVER_URL;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...