我有几个文件如下:
的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中加载了?
提前致谢
答案 0 :(得分:1)
在PHP中包含文件时,您没有在当前文件中包含任何内容,而是包含在当前执行
中一旦包含文件,PHP解释器的内容就是已知 - 并且在当前脚本执行结束之前将保持已知。 / p>
这有点像复制粘贴:使用您当前的index.php
文件,就像您从foo.php
和bar.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作为参数。根据用途,这可以在构造函数或特定方法中完成。