Я пытаюсь инкапсулировать включенный файл в функцию. Ничто из включенного файла не должно быть доступно вне функции инкапсуляции.
Я обнаружил, что переменные из включенного файла будут ограничены областью действия функции инкапсуляции, но функции из включенного файла будут доступны глобально.
index.php:
function encapsulate_this() {
include 'some_file.php';
}
encapsulate_this();
echo say_hello();
echo $test_variable;
some_file.php:
$test_variable = "Hi!";
function say_hello() {
return "Hello!";
}
Выход:
Hello!
В приведенном выше примере эхо say_hello () будет работать, но $ test_variable не будет.
Как я могу успешно инкапсулировать функции из включенного файла, чтобы они не были глобально доступны?
Все функции (и классы) являются глобальными в PHP, для таких вещей нет понятия «область действия». Я вижу только два варианта:
Назовите свои функции и / или классы таким образом, чтобы они не вступали в конфликт с другими глобальными объектами. Пространства имен здесь могут помочь. Например. если вы строго применяете PSR-4 называя стандарты для всех файлов и всех функций, на самом деле не имеет значения, представлены ли функции глобально или нет, поскольку их имена не могут конфликтовать.
использование анонимные функции, что является единственным способом определения функций:
$say_hello = function () {
return 'Hello';
};
Очевидно, что оба зависят от включенного файла, чтобы сотрудничать; если вы включаете сторонний файл, который не соответствует ни одному из стандартов, вы SOL.
Вы должны рассмотреть анонимные классы (php7 +). В классе вы можете иметь public
, protected
а также private
члены.
public
Члены доступны снаружи класса.
protected
члены доступны изнутри класса и классов, которые наследуют класс.
private
члены доступны только внутри класса.
Небольшой пример:
some_file.php
$helloClass = new class('HelloWorld') {
public function say_hello_public(){
return "Hello!";
}
private function say_hello_private(){
return "Hello!";
}
};
index.php
function encapsulate_this() {
include 'some_file.php';
echo $helloClass->say_hello_public(); //Works because it's a public method.
echo $helloClass->say_hello_private(); //Won't work because it's a private method.
}
encapsulate_this();
echo $helloClass->say_hello_public(); //Won't work outside scope