【问题标题】:Encapsulate included functions?封装包含的函数?
【发布时间】:2016-03-17 10:37:52
【问题描述】:

我正在尝试将包含的文件封装在一个函数中。包含文件中的任何内容都不应在封装函数之外访问。

我发现包含文件中的变量将被限制在封装函数的范围内,但包含文件中的函数将是全局可访问的。

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 scope encapsulation


    【解决方案1】:

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

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

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

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

    显然,两者都依赖于包含的文件来配合;如果您包含不符合任一标准的第三方文件,那么您就是 SOL。

    【讨论】:

      【解决方案2】:

      您应该考虑匿名类 (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
      

      【讨论】:

      • @deceze 是的,但他的粗体问题是:How can I successfully encapsulate functions from the included file so they are not globally accessible? 没有说任何关于全局类的内容
      • “包含文件中的Nothing应该可以在封装函数之外访问。” – 强调我的...
      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多