【问题标题】:PHP scope between two classes两个类之间的 PHP 范围
【发布时间】:2010-07-18 18:42:00
【问题描述】:

我有几个文件如下:

index.php:

require_once("foo.php");
require_once("bar.php");

foo.php:

class foo {

   function1() {

   }

}

bar.php:

class bar {

   ?????

}

我的问题是,有没有办法从 bar 类中的 foo 类访问 function1,而不必在 bar.php 文件中包含 foo.php 文件,因为它已经加载到 index.php 中?

提前致谢

【问题讨论】:

  • 访问方式。静态的?还是访问该类的对象?

标签: php class scope


【解决方案1】:

在 PHP 中包含文件时,您不会将任何内容包含到 当前文件 中,而是包含到 当前执行

一旦一个文件被包含进来,它的内容就会被 PHP 解释器知道 -- 并且在当前脚本执行结束之前一直保持已知

这有点像复制粘贴:对于您当前的 index.php 文件,就像您从 foo.phpbar.php 获取代码并复制粘贴到 index.php 中一样。


所以,是的,一旦foo.php 被加载一次,您就可以从bar.php 访问它定义的内容——即使这两个包含在index.php 中。

(您的意思是 access 有点含糊,但是:您必须将一些方法声明为静态,或实例化 foo 类,...但所有这些都将是可以在 bar 中声明的方法的主体内部使用)


作为旁注:你应该小心你的文件包含:例如,如果你包含两次声明一个类的文件,你会得到一个致命错误,因为禁止定义两个具有相同名称的类。

还记得我之前写的复制粘贴的想法吗?包含一个文件两次,即使是来自两个不同的文件,就像复制粘贴相同的代码两次......

为了避免这个问题,我们经常使用include_once,顾名思义,它确保给定文件只能包含一次。

【讨论】:

    【解决方案2】:

    如果foo.php 已经被加载,那么真正要问自己的问题是,“我是以静态方式还是实例方式访问function1()?”

    如果function1() 是静态函数(在您的示例中不是):

    class bar{
    
      function function2(){
        return foo::function1();
      }
    }
    

    否则,您将不得不实例化 foo 的实例,使其成为本地或类范围的变量,例如

    class bar{
    
      /*
       * @var foo
       */
      private $foo;
    
      function __construct(){
        $this->foo = new foo();
      }
    
      function function2(){
        return $this->foo->function1();
      }
    
    }
    

    也请阅读:http://php.net/manual/en/language.oop5.static.php

    顺便说一句,就像 Pascal MARTIN 解释的那样,您不需要再做一个 include(),但通常对于大型应用程序,您会更喜欢 auto-class-loading

    【讨论】:

      【解决方案3】:

      您应该尝试摆脱手动包含文件,而是寻求一种可以使用自动加载的解决方案。

      自动加载将允许您延迟加载,或仅加载您在每个请求中需要的文件 - 而不是制作包含文件的蜘蛛网。

      您可以使用 __autoload 或 spl_autoload 执行此操作,在此处阅读有关该主题的更多信息:http://php.net/manual/en/language.oop5.autoload.php

      下面自动加载的小例子:

      function __autoload($class_name) {
          require_once $class_name . '.php';
      }
      
      $obj  = new MyClass1();
      $obj2 = new MyClass2(); 
      

      使用自动加载 php 可以在找不到类时自动尝试加载文件,在这个例子中没有理由包含 MyClass1 或 MyClass2 的类文件,如果找不到它们的定义,php 会回退到 __autoload 函数.

      使用这意味着您不必在示例中包含 foo 或 bar,也不必在 index.php 中包含它们

      【讨论】:

        【解决方案4】:

        您可以静态地执行此操作,尽管存在限制,这是一种恶劣的做法,因为该功能实际上并不是静态的。

        foo::function1();
        

        更好的方法是让类 bar 将 foo 作为参数。根据用途,这可以在构造函数或特定方法中完成。

        【讨论】:

          猜你喜欢
          • 2013-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-18
          • 1970-01-01
          • 2020-02-20
          • 1970-01-01
          相关资源
          最近更新 更多