#php #oop #constructor #php-include
#php #ооп #constructor #php-включить
Вопрос:
У меня есть класс, в котором я хочу использовать API, и у меня есть ключи api в отдельном файле в другом каталоге.
Файл ключа api буквально так же прост, как этот:
$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 переменные равны null.
ДВА ВОПРОСА:
1) Как я могу получить доступ к значению переменных в моем конструкторе? Я читал в другом месте, что использование включаемого файла непосредственно в методе является плохой практикой, а также что использование глобальной переменной также было бы плохой практикой.
2) Несколько связанный вопрос, эти файлы, в которых я храню ключи api, находятся в том же каталоге, что и данные о подключении к моей базе данных, но каталог не находится за пределами root. В этом каталоге у меня есть файл .htaccess с надписью «Запретить доступ ко всем». Достаточно ли этого с точки зрения безопасности, или я должен сделать что-то еще?
хорошо, 3 вопроса…
3) Должен ли я вообще беспокоиться о сохранении ключей api в отдельных файлах в этом каталоге или просто встроить их в мой класс?
Надеюсь, кто-нибудь сможет дать мне здесь рекомендации. Спасибо!
Комментарии:
1. Где код, в котором вы создаете экземпляр класса? И, пожалуйста, предоставьте пример того, что находится в файле, содержащем ключи. Переменные среды или конфигурации, зависящие от среды, на данный момент, по моему опыту, в значительной степени являются нормой.
2. Итак, сначала, если требуются
$id
и$key
, затем используйтеrequire
вместоinclude
. Во-вторых, будет предоставляемый код, пока классы определены,new MyApiClass($id, $key)
он должен нормально работать и передаваться вClient
.3. изменен на require и получил эту ошибку: Неустранимая ошибка: require(): требуется неудачное открытие ‘ /path/to/file-with-api-keys.php ‘;
4. Тогда файл, который вы пытаетесь добавить, находится не там, где вы указали PHP. Исправьте это в первую очередь, иначе у вас все равно не будет данных для передачи.
5. Ваш конструктор ожидает, что при создании экземпляра класса будут переданы 2 параметра.
$result = new MyClass();
никогда не будет работать. Это должно быть$result = new MyClass("id","key");
Ответ №1:
-
Конструктор не будет считывать переменные из
file-with-api-keys.php
автоматически. Вы должны указать их следующим образом при создании экземпляра класса:$result = new MyClass($id, $key);
-
Наилучшей практикой является хранение всех ваших PHP-скриптов вне каталога webroot, за исключением
index.php
(он же front controller). -
Да, вам стоит побеспокоиться 🙂 Вся конфигурация, ключи API и т.д. Должны храниться в отдельных файлах, вне кода ваших классов. Вы не должны смешивать эти две вещи. Если вы собираетесь использовать какую-либо систему контроля версий, такую как Git, тогда вы собираетесь зафиксировать код своих классов без каких-либо сведений о конфигурации. Последний будет в вашем
.gitignore
файле. Если вы когда-либо работали в команде программистов, то у каждого из них будут свои отдельные файлы конфигурации.
Комментарии:
1. Я согласен с вашим ответом на вопрос 3, но на остальные 2 — нет. Он мог перегрузить конструктор класса и / или присвоить параметрам значения по умолчанию. Кроме того, наилучшей практикой является хранение любого PHP-файла с важной информацией, такой как учетные данные базы данных, за пределами корня документа или защищенного каталога htaccess. Любые другие PHP-файлы прекрасно работают в корне документа.
2. Кажется, это помогло мне обойти доступные свойства, но теперь я получаю сообщение об ошибке создания экземпляра класса «Client» в моем конструкторе. Возможно, мне нужно задать это в отдельном вопросе SO, но чтобы помочь в моем исследовании, как это называется, когда вы создаете экземпляр другого класса из класса? Это вообще хорошая практика? Новое в ООП.
3. @hyphen Создание экземпляров классов внутри классов — это прекрасно. Вопрос в том, действительно ли это необходимо? Возможно, расширение класса является лучшим решением в зависимости от взаимосвязи между двумя классами. Также может быть интересно взглянуть на классы автоматической загрузки и spl_autoload_register
4. Я уже использую spl_autoload_register(), и API, который я использую, имеет свой собственный класс автозапуска. Возможно, расширение базового класса — это правильный путь. Я собираюсь углубиться в это и, возможно, опубликовать другой вопрос, если я не смогу получить ответ самостоятельно. Спасибо!