PHP访问类在另一个类里面

时间:2010-05-19 02:02:12

标签: php variables global

所以我有两个这样的课程:

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”我该怎么办?

5 个答案:

答案 0 :(得分:8)

你也可以这样做:

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

答案 1 :(得分:4)

让它成为酒吧的一员。尽量不要使用全局变量。

class bar {
    private $foo;

    public function __construct($foo) { $this->foo = $foo; }

    public function barMethod() {
        echo $this->foo->something();
    }
}

答案 2 :(得分:2)

简短的回答:不,没有办法实现你想要的东西。

另一个简短的回答:你正在以“错误”的方式处理课程。一旦选择了面向对象的范例 - 忘记“全局”关键字。

执行所需操作的正确方法是创建foo的实例作为bar的成员并使用它的方法。这称为delegation

答案 3 :(得分:1)

如果你唯一关注的是方法本身而不是另一个类的实例,你可以使用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();

答案 4 :(得分:0)

选项是自动加载您的课程。另外,如果您将类设为静态类,则可以在不使用$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();
        }
    }