2016-10-23 8 views
0

У меня есть класс, где я хочу использовать API, и у меня есть ключи api в отдельном файле в другом каталоге.php доступ к переменным в конструкторе из включенного файла

АНИ файл ключа буквально так просто, как это:

$id = 'xxxxxxx'; 
$key = 'xxxxxxx'; 

Это не работает:

include '/path/to/file-with-api-keys.php'; 

class MyApiClass { 
    public function __construct($id, $token) { 
     $this->client = new Client($id, $token); 
    } 
} 

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

include '/path/to/MyClass.php'; 

$result = new MyClass(); 
$result->myMethod(); 

echo $result; 

Ошибка Я получаю в основном, говоря, что переменные 2 равны нулю.

два вопроса:

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

2) Несколько связанных вопросов, эти файлы, в которых я храню ключи api, находятся в том же каталоге с моими данными о соединении с базой данных, но каталог не находится за пределами корня. В этом каталоге у меня есть файл .htaccess с «Deny From All». Достаточно ли этого с точки зрения безопасности, или я должен делать что-то еще?

OK 3 вопросы ...

3) Должен ли я даже потрудился держать ключи АФИ в отдельных файлах в этом каталоге или просто вставлять их в моем классе?

Надеюсь, кто-то может дать мне лучшие практики здесь. Благодаря!

+0

Где код, в котором вы создаете экземпляр класса? И, пожалуйста, укажите и пример того, что находится в файле, содержащем ключи. Переменные среды или конфигурации, специфичные для окружающей среды, в настоящий момент в значительной степени являются нормой. –

+0

Итак, сначала, если нужны '$ id' и' $ key', тогда используйте 'require', а не' include'. Во-вторых, перейдем к предоставленному коду, если классы определены 'new MyApiClass ($ id, $ key)' должны работать нормально и передаваться в 'Client'. –

+0

изменен, чтобы потребовать и получил эту ошибку: Неустранимая ошибка: require(): Не удалось открыть требуемый ключ '/ path/to/file-with-api.PHP '; – hyphen

ответ

1
  1. Конструктор не будет читать переменные от file-with-api-keys.php автоматически. Вы должны указать их так, как при создании экземпляра класса: $result = new MyClass($id, $key);

  2. Лучшая практика заключается в том, чтобы хранить все ваши скрипты PHP вне каталога веб-сайтов, кроме index.php (aka front controller).

  3. Да, вы должны беспокоиться :) Вся конфигурация, ключи API и т. Д. Должны храниться в отдельных файлах вне кода классов. Вы не должны смешивать эти две вещи. Если вы собираетесь использовать некоторую систему управления версиями, такую ​​как Git, тогда вы собираетесь передать код своего класса без каких-либо деталей конфигурации. Последний будет в вашем файле .gitignore. Если вы когда-либо работаете в команде программистов, то каждый из них будет иметь свои отдельные файлы конфигурации.

+1

Я согласен с вашим ответом на вопрос 3, но второй 2, нет. Он может перегружать конструктор класса и/или давать значения по умолчанию для параметров. Кроме того, наилучшей практикой является сохранение любого файла PHP с * чувствительной * информацией, такой как учетные данные базы данных за пределами корня документа * или * защищенный htaccess каталог. Любые другие файлы PHP отлично вписываются в корень документа. – icecub

+0

Похоже, что мне удалось пройти мимо свойств, к которым вы обращались, но теперь я получаю сообщение об ошибке создания экземпляра класса «Клиент» в моем конструкторе. Может быть, мне нужно спросить об этом в отдельном вопросе SO, но чтобы помочь в моих исследованиях, что это значит, когда вы создаете экземпляр другого класса из класса? Это даже хорошая практика? Новое для ООП. – hyphen

+1

@hyphen Создание экземпляров классов внутри классов отлично. Вопрос в том, действительно ли это необходимо? Возможно, расширение класса является лучшим решением в зависимости от соответствия между двумя классами. Также может быть интересно взглянуть на [Автозагрузка классов] (http://php.net/manual/en/language.oop5.autoload.php) и [spl_autoload_register] (http://php.net/manual/ ru/function.spl-autoload-register.php) – icecub