有没有一种方法可以定义一个全局变量,它可以从类方法访问?

问题描述:

这里的情况是 我创建一个类的实例有没有一种方法可以定义一个全局变量,它可以从类方法访问?

$newobj = new classname1; 

那么下面我有另一个类writtern,我想这个类来访问上述

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

不允许对象,有没有一种方法通过一个类来定义全局变量?

+3

听起来不是一个好主意我 – 2010-05-14 07:21:22

+0

它并不总是一个坏主意,让$ newobj是一个数据库类的实例,那么它是非常有用的 – Harmen 2010-05-14 07:26:59

+0

在我的情况下它 – Starx 2010-05-14 07:29:46

制作实例全球:

$newobj = new classname1; 

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

因为我得到了第一线downvote,我删除它。

+4

不需要第一个全局。全局关键字只能在函数中使用 – knittl 2010-05-14 07:23:15

可以看看使用singleton pattern。 这基本上是创建自己的实例类和后续调用将访问这个实例,因此实现什么,我想你可能是最多......

允许的,但你需要使用适当的语法:要么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

您还可以从classname1继承你的NewClass和那么你将能够调用类'classname1'的方法 这样的:

 

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