封装包含的函数?

时间:2016-03-17 10:37:52

标签: php scope encapsulation

我正在尝试将包含的文件封装在函数中。在封装功能之外,无法访问包含文件中的任何内容。

我发现,包含文件中的变量将仅限于封装功能的范围,但所包含文件中的函数将可全局访问。

的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!

在上面的示例中,echoing say_hello()将起作用,但$ test_variable不会。

如何成功封装所包含文件中的函数,使其无法全局访问?

2 个答案:

答案 0 :(得分:1)

所有函数(和类)在PHP中都是全局的,对于那些东西,没有“范围”这样的概念。我只看到两个选项:

  1. 以某种方式命名您的函数和/或类,以便它们不会与其他全局事物冲突,命名空间在这里可以提供很多帮助。例如。如果您严格将PSR-4命名标准应用于所有文件和所有函数,那么函数是否全局公开并不重要,因为它们的名称不会发生冲突。

  2. 使用匿名函数,这是限定函数的唯一方法:

    $say_hello = function () {
        return 'Hello';
    };
    
  3. 显然,两者都依赖于包含的文件进行合作;如果您包含的第三方文件不符合任何标准,那么您就是SOL。

答案 1 :(得分:0)

你应该考虑匿名类(php7 +)。在课堂上,您可以拥有publicprotectedprivate成员。

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