Расположение лучших практик для значений опций для классов - PullRequest
2 голосов
/ 14 ноября 2011

В проекте PHP MVC у меня есть несколько классов моделей, которые загружают данные из веб-службы RESTful, для которой требуется ключ API. Я хотел бы сохранить необходимый ключ API в центральном конфигурационном файле моего приложения.

Чтобы получить этот ключ API для моего класса, какой метод лучше всего подойдет?

  1. Поместите значение в $GLOBALS, чтобы к нему можно было обращаться непосредственно внутри классов модели, которые его используют.
  2. Передайте значение классу при создании экземпляра.

Метод # 2 кажется наилучшим для ООП и повторного использования кода, но метод # 1 очень удобен. Обычно я использую метод № 2, но я хочу знать, считается ли метод № 1 приемлемым использованием $GLOBALS даже в среде OOP MVC.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2011

Symfony 1.4 использует sfConfig :: get ('my_value'), который похож на ваш первый вариант, только обернутый в объект.

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

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

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

Надеюсь, это поможет ...

1 голос
/ 14 ноября 2011

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

define('API_KEY', 'foobar');

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

0 голосов
/ 14 ноября 2011

Вы также можете использовать константы класса и / или статику:

class myClass
{
    const MY_API_KEY = 'somestringofstuff';

    // Or use a static array if you need access to multiple keys

    public static $apiKeys = array(
        'dev' => 'mydevapikey',
        'prod' => 'myprodapikey'
    );
}


// Calling code
$apiKey = myClass::MY_API_KEY;

// Or

$apiKey = myClass::$apiKeys['dev'];
...