Как использовать переменную из другого файла с

Обновлено: 05.07.2024

У меня есть переменные базы данных из файла с именем config.php :

теперь у меня есть класс PHP в папке / class, и он отлично работает для процесса CRUD. названный MysqlCrud.class.php :

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

почему я не могу использовать переменные из файла config.php внутри класса Database? что я тут не так сделал? благодарю вас.

Решение

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

Я был бы более склонен настроить это так:

database.php

Затем в файле вы используете Database учебный класс:

Другие решения

Может быть, вы можете попробовать это так:

Поместите эту функцию в ваш конфигурационный файл или другой файл, такой как globalFunctions.php (который содержит все необходимые вам общие функции). Просто вызывайте эту функцию каждый раз, когда вам это нужно.

Внутри класса вы можете иметь ТОЛЬКО объявление члена. Глобальные переменные НЕ являются членами класса, поэтому вы не можете иметь их внутри класса. Но вы можете иметь их внутри методов.

Изменить 2017-07-11:

Не делай этого. Не используйте глобальные переменные. Их легко где-то перезаписать, и в итоге вы будете много отлаживать. Плюс требует global Ключевое слово грязное. Правильное частичное решение предоставлено @ br3nt. Но он по-прежнему использует глобальные переменные и инициализирует $db переменная в глобальной области видимости.

Если у вас есть доступ к конфигурации сайта в Apache, например, для этого сайта, вы можете использовать mod_env для настройки конфигурации в переменных среды. Пример:

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

Config.class.php

Редактировать 2, тот же день

Почему глобалы плохи?

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

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

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

Вот вариант, чтобы установить для ваших членов класса глобальное значение, используя __construct()

Также, если вы хотите избежать написания global Вы можете использовать зарезервированную переменную $GLOBALS который, как описано в документация является:

Ассоциативный массив, содержащий ссылки на все переменные, которые в настоящее время определены в глобальной области действия сценария. Имена переменных являются ключами массива.

Я стараюсь избегать занятий, поэтому имейте это в виду.

Я хочу знать, как получить доступ к переменной из другого.cpp файла.

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

Все ответы были оценены.

спросил(а) 2015-04-11T16:11:00+03:00 6 лет, 7 месяцев назад

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

Вам нужно понять разницу между декларацией и определением:

    Когда вы объявляете переменную, вы указываете только компилятору, что там есть имя (= символ) и тип этого символа. Когда вы назначаете конкретное значение переменной или предоставляете реализацию для нее, вы определяете ее (например, в случае функций).

У вас может быть произвольное количество объявлений для символа, но для него должно быть только одно определение. См. Также эту тему: Что такое правило одного определения в C++?

Если вы хотите использовать один и тот же символ в нескольких файлах.cpp (ссылаясь на один и тот же объект), вам нужно использовать ключевое слово extern в файле заголовка:

Вы можете включить этот заголовок в любое количество.cpp файлов, чтобы ввести символ i . Вы должны указать определение для i только в одном.cpp:

ответил(а) 2015-04-11T16:17:00+03:00 6 лет, 7 месяцев назад

Предположительно, "файл.cpp" означает "единица перевода".

Святому C++ стандарту все равно, как код распространяется в файлах, и не имеет понятия файлов заголовков в сравнении с.cpp.

Переменная, которая должна быть определена в одной единицы перевода и доступна в другой, должна иметь extern связь. Это значение по умолчанию для переменных const non- const . Тем не менее, обычное объявление также определит переменную, а затем вы столкнетесь с Правилом Единого определения, которое в общем требует единого определения каждой вещи.

Решение состоит в том, чтобы написать, например,

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

Вы можете иметь как можно больше чистых деклараций.

Лучше всего поставить такое объявление в файл заголовка, чтобы избежать избыточных множественных, возможно, не совсем совпадающих деклараций. Обратите внимание, что в заголовочном файле он будет включен как часть каждого соответствующего текста единицы перевода. Компилятору C++ все равно, откуда оно взялось, просто там.

" Объявление - это определение, если оно не объявляет функцию без указания тела функций (8.4), содержит спецификатор extern (7.1.1) или спецификацию привязки (7.5) и ни инициализатор, ни тело функции, оно объявляет статический член данных в определении класса (9.2, 9.4), это объявление имени класса (9.1), это непрозрачная-enum-декларация (7.2), это параметр шаблона (14.1), это параметр -declaration (8.3.5) в деклараторе функции, который не является декларатором определения функции, или является объявлением typedef (7.1.3), декларацией alias (7.1.3), использованием-декларации (7.3.3), static_assert-декларация (раздел 7), декларация атрибута (раздел 7), декларация с пустым (раздел 7) или директива using (7.3.4).

Я немного не понимаю, как работает переменный доступ между файлами .cpp. Например:

main.cpp

main2.cpp

Это генерирует ошибку компилятора на main.cpp, сообщая мне, что в я отсутствует. Какая разница тогда, делает ли это "статическое" ключевое слово в этом контексте? (Я попробовал Google для этого, но большинство информационных страниц "static keyword" рассказывают о классах и функциях)

main2.cpp

Это то же самое? Предотвращает ли это использование extern int i для доступа к i в другом месте? Как использование анонимных пространств имен отличается тем, как обрабатываются переменные?

main2.cpp

    Доступны переменные-переменные между .cpp файлами? (кроме ключевого слова extern)
    Как статическое ключевое слово в глобальной переменной влияет на вещи?
    Как анонимные пространства имен влияют на вещи по-другому?
спросил(а) 2010-09-07T22:46:00+04:00 11 лет, 2 месяца назад

В первом примере main2.cpp определяет глобальную переменную i , к которой можно было получить доступ main.cpp , если в этом файле появилось объявление extern i . (Обычно объявление extern поступает из файла заголовка.) У вас возникла ошибка компилятора, поскольку i никогда не был объявлен в main.cpp , что означает, что компилятор предполагает, что такой переменной нет.

В вашем втором примере main2.cpp определяет переменную области видимости файла i . Переменные области видимости файла отличны от глобальных, даже если они имеют одно и то же имя. Если во втором примере у вас было объявление extern i в main.cpp , оба файла были бы скомпилированы успешно, но тогда вы получили бы ошибку ссылки, потому что не было определено глобальная переменная i .

Если вы переименовали main2.cpp из второго примера в main3.cpp , добавили декларацию extern от i до main.cpp , скомпилировали все три и связали все вместе, что было бы успешным; main.cpp и main2.cpp будут использовать одну переменную с именем i , а main3.cpp будет иметь свою собственную полностью отдельную переменную, также называемую i .

Этот материал называется связью. Пространства имен почти полностью не связаны с привязкой. Однако анонимное пространство имен является особенным. Определение переменной в анонимном пространстве имен для всех практических целей так же, как определение ее с помощью static - делает ее переменной области файла. (Если я правильно помню, есть разница, но это имеет значение только в том случае, если вы делаете сложные вещи с экспортированными шаблонами, а поскольку экспортированные шаблоны так мало используются, что они говорят об удалении функции из стандарта С++, я должен беспокоиться об этом.)

Значение анонимного пространства имен заключается в том, что вы можете поместить в него определение класса, и это делает все методы класса локальными. (Для получения этого эффекта должен быть только блок class < . >внутри блока namespace < . >.) Вы не можете сделать это каким-либо другим способом.

Я стараюсь избегать занятий, так что имейте это в виду.

Я хочу знать, как получить доступ к переменной из другого файла .cpp.

Все ответы приветствуются.

Решение

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

Вы должны понимать разницу между объявлением и определением:

  • Когда вы объявляете переменную, вы только сообщаете компилятору, что есть имя (= символ) и тип этого символа.
  • Когда вы присваиваете конкретное значение переменной или предоставляете для нее реализацию, вы определяете ее (например, в случае функций).

Вы можете иметь произвольное количество объявлений для символа, но у вас должно быть только одно определение для него. Смотрите эту тему тоже: Что именно является одним правилом определения в C ++?

Если вы хотите использовать один и тот же символ в нескольких файлах .cpp (ссылаясь на один и тот же объект), то вам нужно использовать extern Ключевое слово в заголовочном файле:

Вы можете включить этот заголовок в любое количество файлов .cpp, чтобы ввести символ i , Вы должны указать определение для i только в одном .cpp:

Другие решения

Священный стандарт C ++ не может не заботиться о том, как код распределяется в файлах, и не имеет представления о файлах заголовков по сравнению с .cpp.

Переменная, которая должна быть определена в одной единице перевода и доступна в другой, должна иметь extern связь. Это значение по умолчанию для уровня имен const переменные. Однако обычная декларация также определять переменная, а затем вы столкнетесь с Одно Правило Определения что в целом требует одного определение каждой вещи.

в блоке перевода, где вы просто хотите получить доступ к переменной. Явное упоминание о extern связь, без инициализатора, делает это чистая декларация.

Вы можете иметь столько чистых объявлений чего-либо, сколько захотите.

Лучше всего поместить такое объявление в заголовочный файл, чтобы избежать нескольких избыточных, возможно, не совсем совпадающих объявлений. Обратите внимание, что в заголовочном файле он будет включен как часть текста каждой соответствующей единицы перевода. Компилятору C ++ все равно, откуда он, просто он там.

C ++ 11 §3.1 / 2:

» Декларация является определение если она не объявляет функцию без указания тела функции (8.4), она
содержит extern спецификатор (7.1.1) или Связь-спецификация (7.5) и ни инициализатор ни функция тела, он объявляет член статических данных в определении класса (9.2, 9.4), это объявление имени класса (9.1), это непрозрачное-перечисление декларация (7.2), это Шаблон-параметр (14.1), это Параметр декларирование (8.3.5) в
объявление функции, которая не является описатель из Функция четкости, или это typedef декларация (7.1.3),
псевдоним декларации (7.1.3), а используя декларирование (7.3.3), а static_assert декларация (Пункт 7), Атрибут декларирование (Пункт 7), пустая декларация (Пункт 7) или с помощью директивы (7.3.4).

Теперь первое, что вы должны быть осторожны, вы не определяете вещи несколько раз.

Во-вторых, вы должны хотя бы прочитать учебник по основам языка программирования c ++.

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

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

Читайте также: