有没有办法定义一个可以从类方法访问的全局变量?

时间:2010-05-14 07:16:12

标签: php oop dynamic-websites

情况如下 我创建了一个类

的实例
$newobj = new classname1;

然后我在下面有另一个类,我希望这个类访问上面的对象

class newclass {
    public function test() {
       echo $newobj->display();
    }
}

不允许,是否有办法通过类全局定义变量?

4 个答案:

答案 0 :(得分:6)

允许 ,但您需要使用适当的语法:global关键字或$GLOBALS超全局:

http://es.php.net/manual/en/language.variables.scope.php

http://es.php.net/manual/en/reserved.variables.globals.php

<?php

class classname1{
    private $id;
    public function __construct($id){
        $this->id = $id;
    }
    public function display(){
        echo "Displaying " . $this->id . "...\n";
    }
}
$newobj = new classname1(1);

class newclass {
    public function test() {
        global $newobj;
        echo $newobj->display();
    }
    public function test_alt() {
        echo $GLOBALS['newobj']->display();
    }
}

$foo = new newclass;
$foo->test();
$foo->test_alt();

?>

但是,必须始终谨慎使用全局变量。它们可能导致难以理解和维护的代码以及难以追踪的错误。通常传递所需的参数通常更容易:

<?php

class classname1{
    private $id;
    public function __construct($id){
        $this->id = $id;
    }
    public function display(){
        echo "Displaying " . $this->id . "...\n";
    }
}
$newobj = new classname1(1);

class newclass {
    public function test(classname1 $newobj) {
        echo $newobj->display();
    }
}

$foo = new newclass;
$foo->test($newobj);

?>

最后但同样重要的是,您可能正在寻找单身OOP模式:

http://en.wikipedia.org/wiki/Singleton_pattern

答案 1 :(得分:1)

使实例成为全局:

$newobj = new classname1;

class newclass {
    public function test() {
       global $newobj;
       echo $newobj->display();
    }
}

由于我获得了第一行的downvote,我删除了它。

答案 2 :(得分:0)

可以考虑使用singleton pattern。 这基本上是一个创建自身实例的类,后续调用将访问此实例,从而实现我认为您可能达到的目标......

答案 3 :(得分:0)

你也可以从classname1继承你的新类,然后你就可以调用类'classname1'的方法了 像这样:


class newclass extends classname1 {
    public function test() {
       echo parent::display();
    }
}