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还为时过早。