13
回答
php超级对象怎么定义
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

定义一个类如:

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

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

以下是问题补充:

  • @自由自在的小鱼 :我不想使用 global (3年前)
  • @自由自在的小鱼 :codeigniter 就存在这种全局对象,如:$this->db,$this->lang等,看了代码,被绕晕了,我知道是使用单例,但不明白如何做到,那位大神能简单的说下CI是如何做的? (3年前)
共有13个答案 最后回答: 3年前
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这样调用,



把对象声明成属性或者当参数传进去不就好了么。
--- 共有 1 条评论 ---
自由自在的小鱼如果A是mysql类,那每个类都要把A作为参数,是不是很麻烦啊?还不如A::getinstance()->test()来的方便 3年前 回复
// 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里来的代码.

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






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

// 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,需要的时候用配置去读取或者加载需要的类,思路大概就是这么个思路。

顶部