PHP访问类在另一个类中
我有两门课是这样的:PHP访问类在另一个类中,php,variables,global,Php,Variables,Global,我有两门课是这样的: class foo { /* code here */ } $foo = new foo(); class bar { global $foo; public function bar () { echo $foo->something(); } } class bar { public function bar () { global $foo; echo $foo->s
class foo {
/* code here */
}
$foo = new foo();
class bar {
global $foo;
public function bar () {
echo $foo->something();
}
}
class bar {
public function bar () {
global $foo;
echo $foo->something();
}
public function barMethod () {
global $foo;
echo $foo->somethingElse();
}
/* etc */
}
我想在所有方法栏中访问foo的方法,而不在每个方法栏中声明它,如下所示:
class foo {
/* code here */
}
$foo = new foo();
class bar {
global $foo;
public function bar () {
echo $foo->something();
}
}
class bar {
public function bar () {
global $foo;
echo $foo->something();
}
public function barMethod () {
global $foo;
echo $foo->somethingElse();
}
/* etc */
}
我也不想扩展它。我尝试使用var关键字,但似乎不起作用。如何访问bar所有方法中的另一个类“foo”?使其成为bar的成员。尽量不要使用globals
class bar {
private $foo;
public function __construct($foo) { $this->foo = $foo; }
public function barMethod() {
echo $this->foo->something();
}
}
你也可以这样做:
class bar {
private $foo = null;
function __construct($foo_instance) {
$this->foo = $foo_instance;
}
public function bar () {
echo $this->foo->something();
}
public function barMethod () {
echo $this->foo->somethingElse();
}
/* etc, etc. */
}
以后你可以做:
$foo = new foo();
$bar = new bar($foo);
简单的回答是:不,没有办法实现你想要的 另一个简短的回答是:你以“错误”的方式与班级合作。一旦你选择了面向对象的范例——忘记“全局”关键字
正确的方法是创建
foo
的实例作为bar
的成员,并使用其方法。这称为委派
一个选项是自动加载类。另外,如果将类设置为静态类,则可以在不使用$classname=new classname()
的情况下调用它:
如果将类(foo)转换为静态类
//Autoloader
spl_autoload_register(function ($class) {
$classDir = '/_class/';
$classExt = '.php';
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt;
});
//Your code
class bar {
public function bar () {
echo foo::something();
}
}
如果您只关注方法本身而不是另一个类的实例,那么可以使用
x-extends-y
class foo {
function fooMethod(){
echo 'i am foo';
}
}
class bar extends foo {
function barMethod(){
echo 'i am bar';
}
}
$instance = new bar;
$instance->fooMethod();
从未想过将其作为参数传递;现在可以了。谢谢仅供参考,这就是所谓的依赖关系Injection@John:如果某人甚至不知道如何通过参数传递数据,那么现在谈论DI还为时过早。