Поэтому у меня есть два класса:
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(); } }