[英]PHP access class inside another class
所以我有两个这样的类:
class foo {
/* code here */
}
$foo = new foo();
class bar {
global $foo;
public function bar () {
echo $foo->something();
}
}
我想在所有方法栏中访问foo的方法,而不是在bar内的每个方法中声明它,如下所示:
class bar {
public function bar () {
global $foo;
echo $foo->something();
}
public function barMethod () {
global $foo;
echo $foo->somethingElse();
}
/* etc */
}
我也不想延长它。 我尝试使用var关键字,但似乎没有用。 我怎么做才能在bar的所有方法中访问其他类“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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.