Вот несколько примеров из языка PHP, надеюсь, это поможет вам понять
class Users
{
var $Database;
public function __construct(Database $DB)
{
$this->Database = $DB;
}
}
$Database = Database::getInstance();
$Users = new Users($Database);
Из этого примера в методе getInstance()
используется ключевое слово new
, вы также можете сделать
$Users = new Users(Database::getInstance());
Или другой способ решения этой проблемы
class Users
{
/*Dependencies*/
private $database,$fileWriter;
public function addDependency($Name,$Object)
{
$this->$Name = $Object;
return $this;
}
}
$Users = new Users();
$Users->addDependency('database',new Database)->addDependency('fileWriter',new FileWriter);
Обновление:
Если честно, я никогда не использую Dependency Injection, так как все, что он делает, это передает объекты в классы для создания локальной области видимости.
Я стремлюсь создать глобальную сущность и хранить в ней объекты, поэтому они хранятся только в 1 переменной.
Позвольте мне показать вам небольшой пример:
abstract class Registry
{
static $objects = array();
public function get($name)
{
return isset(self::$objects[$name]) ? self::$objects[$name] : null;
}
public function set($name,$object)
{
self::$objects[$name] = $object;
}
}
Хорошо, красота этого типа класса
- очень легкий
- имеет глобальную область действия
- вы можете хранить что угодно, например ресурсы
Когда ваша система загрузится и вы включите и инициализируете все ваши объекты, вы можете просто сохранить их здесь, вот так:
Registry::add('Database',new Database());
Registry::add('Reporter',new Reporter());
Где бы вы ни находились во время выполнения, вы можете просто использовать это как глобальную переменную:
class Users
{
public function getUserById($id)
{
$query = "SELECT * FROM users WHERE user_id = :id";
$resource = Registry::get("Database")->prepare($query);
$resource->bindParam(':id',$id,PDO::PARAM_INT);
if($resource->execute())
{
//etc
}else
{
Registry::get('Reporter')->Add("Unable to select getUserById");
}
}
}
я вижу, что этот способ передачи объектов намного чище