Инкапсулировать включенные функции?

Я пытаюсь инкапсулировать включенный файл в функцию. Ничто из включенного файла не должно быть доступно вне функции инкапсуляции.

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

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 не будет.

Как я могу успешно инкапсулировать функции из включенного файла, чтобы они не были глобально доступны?

2

Решение

Все функции (и классы) являются глобальными в PHP, для таких вещей нет понятия «область действия». Я вижу только два варианта:

  1. Назовите свои функции и / или классы таким образом, чтобы они не вступали в конфликт с другими глобальными объектами. Пространства имен здесь могут помочь. Например. если вы строго применяете PSR-4 называя стандарты для всех файлов и всех функций, на самом деле не имеет значения, представлены ли функции глобально или нет, поскольку их имена не могут конфликтовать.

  2. использование анонимные функции, что является единственным способом определения функций:

    $say_hello = function () {
    return 'Hello';
    };
    

Очевидно, что оба зависят от включенного файла, чтобы сотрудничать; если вы включаете сторонний файл, который не соответствует ни одному из стандартов, вы SOL.

1

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

Вы должны рассмотреть анонимные классы (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
0

По вопросам рекламы [email protected]