Класс доступа PHP внутри другого класса

Поэтому у меня есть два класса:

class foo { /* code here */ } $foo = new foo(); class bar { global $foo; public function bar () { echo $foo->something(); } } 

Я хочу получить доступ к методам foo внутри всех панелей методов, не объявляя их в каждом методе внутри бара, например:

 class bar { public function bar () { global $foo; echo $foo->something(); } public function barMethod () { global $foo; echo $foo->somethingElse(); } /* etc */ } 

Я тоже не хочу его расширять. Я попытался использовать ключевое слово var, но, похоже, это не сработало. Что я делаю, чтобы получить доступ к другому классу «foo» во всех методах бара?

Вы тоже можете это сделать:

 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); 

Сделайте его членом бара. Старайтесь никогда не использовать глобальные переменные.

 class bar { private $foo; public function __construct($foo) { $this->foo = $foo; } public function barMethod() { echo $this->foo->something(); } } 

Короткий ответ: нет, нет способа реализовать то, что вы хотите.

Другой короткий ответ: вы работаете с классами «неправильно». Как только вы выбрали объектно-ориентированную парадигму – забудьте о «глобальном» ключевом слове.

Правильный способ делать то, что вы хотите, – создать экземпляр foo как члена bar и использовать его методы. Это называется delegation .

И если ваш единственный фокус – это сами методы, а не экземпляр другого класса, вы можете использовать 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(); 

Опция заключается в автозагрузке ваших классов. Кроме того, если вы сделаете свой класс статическим классом, вы можете вызвать его без $classname = new classname() :

 //Autoloader spl_autoload_register(function ($class) { $classDir = '/_class/'; $classExt = '.php'; include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; }); //Your code class bar { private static $foo = null; //to store the class instance public function __construct(){ self::$foo = new foo(); //stores an instance of Foo into the class' property } public function bar () { echo self::$foo->something(); } } 

Если вы преобразуете свой класс (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(); } }