两个类之间的PHP范围

时间:2010-07-18 18:42:00

标签: php class scope

我有几个文件如下:

的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中加载了?

提前致谢

4 个答案:

答案 0 :(得分:1)

在PHP中包含文件时,您没有在当前文件中包含任何内容,而是包含在当前执行

一旦包含文件,PHP解释器的内容就是已知 - 并且在当前脚本执行结束之前将保持已知。 / p>

这有点像复制粘贴:使用您当前的index.php文件,就像您从foo.phpbar.php获取代码并将其复制粘贴到{{1} }。


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

access 的含义有点模糊,但是:你必须将某些方法声明为静态,或者将index.php类设置为实例,但是所有这些可以在foo

中声明的方法体内进行


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

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

为了避免这个问题,我们经常使用include_once,正如其名称所示,它确保给定文件只能包含一次。

答案 1 :(得分:1)

如果已加载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

答案 2 :(得分:1)

您应该尝试远离手动包含文件,而是尝试使用自动加载的解决方案。

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

您可以使用__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中包含它们

答案 3 :(得分:0)

你可以静态地做,虽然有一些限制,这是一个残暴的做法,因为该功能实际上不是静态的。

foo::function1();

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