php超级对象怎么定义

自由自在的小鱼 发布于 2014/08/05 09:35
阅读 754
收藏 1
PHP

定义一个类如:

class A {
    function test {
        echo "Class A";
    }
}
想将这个类全局化,在其他类中可以直接引用如:
$A=new A();

class B {
     function test_b {
          $A->test();
     }
}
怎么才能实现?

以下是问题补充:

@自由自在的小鱼:我不想使用 global (2014/08/05 09:37)
@自由自在的小鱼:codeigniter 就存在这种全局对象,如:$this->db,$this->lang等,看了代码,被绕晕了,我知道是使用单例,但不明白如何做到,那位大神能简单的说下CI是如何做的? (2014/08/05 10:56)
加载中
0
jacky-zhuo
jacky-zhuo
class A {
    public function test() {
        echo 'this is class a';
    }
}

//定义一个基本class, 后定义的class都继承这个class
class Base {
    public $a;

    public function __construct() {
        $this->a = new A();
    }
}

//B继承Base
class B extends Base {
    public function hi() {
        $this->a->test();
    }
}

//只要继承Base的, 都可以$this->a直接调用一个实例化的class A


//CI中的controller, model都分别已经写了一个基类, 并且用户写的contoller和model都要分别继承它们的基类, 所以你才能$this->lang这样调用,



0
开源中国首席保安
开源中国首席保安
什么叫超级对象
0
chenwenli
chenwenli
你可以定义单例方法
自由自在的小鱼
自由自在的小鱼
单例也想过,可是A:getinstance()->test()写起来,读起来都没$A->好
0
姜SS
姜SS
把对象当做参数传进去不行吗 ?
0
悲催不悲催
悲催不悲催
把对象声明成属性或者当参数传进去不就好了么。
自由自在的小鱼
自由自在的小鱼
如果A是mysql类,那每个类都要把A作为参数,是不是很麻烦啊?还不如A::getinstance()->test()来的方便
0
JPer
JPer
变量作用域;
0
leo108
leo108

$this->db这个根本就不是全局变量,楼主先搞明白$this是什么再说

0
每天打起精神即可
每天打起精神即可
ci里面其实是没.  所谓的 $this->db 得到数据库类, 其实框架里有将 db的实例化注册到$this这个类里的.
mark35
mark35
回复 @自由自在的小鱼 : CI是通过$this->load->library('db')来初始化db类库的,然后才有$this->db这个
自由自在的小鱼
自由自在的小鱼
能再详细点吗?
0
每天打起精神即可
每天打起精神即可
// Registry
$registry = new Registry();

// Loader
$loader = new Loader($registry);
$registry->set('load', $loader);

// Config
$config = new Config();
$registry->set('config', $config);

// Database
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$registry->set('db', $db);


Registry类 :

final class Registry {
	private $data = array();

	public function get($key) {
		return (isset($this->data[$key]) ? $this->data[$key] : NULL);
	}

	public function set($key, $value) {
		$this->data[$key] = $value;
	}

	public function has($key) {
		return isset($this->data[$key]);
	}
}



这些是opencart里来的代码.

说白了,还是靠传参进去,只是你的类多的话这样就方便了.






0
NILYANG
NILYANG

引用来自“每天打起精神即可”的评论

// Registry
$registry = new Registry();

// Loader
$loader = new Loader($registry);
$registry->set('load', $loader);

// Config
$config = new Config();
$registry->set('config', $config);

// Database
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$registry->set('db', $db);


Registry类 :

final class Registry {
	private $data = array();

	public function get($key) {
		return (isset($this->data[$key]) ? $this->data[$key] : NULL);
	}

	public function set($key, $value) {
		$this->data[$key] = $value;
	}

	public function has($key) {
		return isset($this->data[$key]);
	}
}



这些是opencart里来的代码.

说白了,还是靠传参进去,只是你的类多的话这样就方便了.






类似 ,简单实现就是类似opencart这种,注册一个全局类,然后将需要实例化的类放到全局里面去,引用的时候,就直接用全局去取就行了。

当然,复杂一点或者更灵活的一点就可以更彻底的DI,类似symfony2,需要的时候用配置去读取或者加载需要的类,思路大概就是这么个思路。

返回顶部
顶部