我有“User_registration”课程,在本课程中我需要使用许多课程:“位置”,“链接”,“邮件”,“模块”。
我创建包含文件中的所有类: 包括'class / location.php'; 包括'class / links.php'; 包括'class / mail.php'; 包括'class / modules.php';
现在创建“User_registration”类。
<?php
class User_registration{
public function insert_to_db($name, $country_code, $home_page)
{
//work with data
return id;
}
public function show_info($id)
{
//work with data
}
}
$reg_u = new User_registration;
$res = $reg_u->insert_to_db($name, $country_code, $home_page);
if($res){
$reg_u->show_info($res);
}
?>
我需要在方法“insert_to_db”中运行类:“Location”,“Links”,“Mail”方法 并在“show_info”中运行“Location”,“Links”,“Module”类的一些方法。
如何?如何在一个类中运行另一个类(不是一个)
感谢您的帮助;)
答案 0 :(得分:2)
有几种方法可以做到这一点。如果只有一些对象需要使用其他类,请使用依赖注入;将每个对象作为参数传递给类的构造函数,并将这些对象存储为类属性。
如果只有一个方法需要该对象,则将该对象作为方法的参数传递。我不赞成这种方法,因为从长远来看,我觉得它会阻碍可扩展性/代码清洁。
如果你有几个类需要很多对象,我建议你注入一个类的构造函数的注册表。注册表是一个单例(它包含您需要共享的每个对象的单个实例)。在需要使用共享对象的类中,您可以调用$this->registry->get('Some_Shared_Object')->doSomething()
。
依赖注入(在构造函数中)
class Foo {
protected $dependency1;
protected $dependency2;
protected $dependency3;
public function __construct($dependency1, $dependency2, $dependency3) {
$this->dependency1 = $dependency1;
$this->dependency2 = $dependency2;
$this->dependency3 = $dependency3;
}
public function foo() {
$this->dependency1->doSomething();
}
}
$foo = new Foo($dependency1, $dependency2, $dependency3);
$foo->foo();
依赖注入(在该方法中,不推荐)
class Foo {
public function foo($dependency1) {
$dependency1->doSomething();
}
}
$foo = new Foo();
$foo->foo($dependency1);
使用注册表进行依赖注入
class Registry {
var $data = array();
function __get($key) {
return $this->get($key);
}
function __set($key, $value) {
$this->set($key, $value);
}
/**
* Retrieve a resource from the registry.
*
* @param string
* @return mixed|null
*/
function get($key) {
return isset($this->data[$key]) ? $this->data[$key] : NULL;
}
/**
* Store a resource in the registry.
*
* @param string
* @param mixed
*/
function set($key, &$value) {
$this->data[$key] = $value;
}
/**
* Check if a resource exists in the registry.
*
* @param string
* @return boolean
*/
function has($key) {
return isset($this->data[$key]);
}
}
class Foo {
protected $registry;
public function __construct($registry) {
$this->registry = $registry;
}
public function foo() {
$this->registry->dependency1->doSomething();
}
}
$dependency1 = new Dependency1();
$registry = new Registry();
$registry->set('dependency1', $dependency1);
$foo = new Foo($registry);
$foo->foo();
答案 1 :(得分:1)
作为一种好的做法,当我从类中调用类时,我总是使用include_once / require_once。这样我就知道无论在哪个阶段使用它的参考资料都要照顾并且不要过多。
初始化每个实例并从那里调用您的方法。不要害怕静态引用。