Twój obiekt Articles, z tego co napisałeś, jest swoistym managerem - ona powinna być odpowiedzialna za taką operacje. Ale to w teorii. W praktyce obiekt Article też mógłby potrafić usunąć sam siebie.
<?php
class Article {
protected $id;
public function setId($id)
{
$this->id = $id;
}
public function delete()
{
print "DELETE FROM articles WHERE id = {$this->id}" . PHP_EOL
; // Tutaj usuwamy artykuł z bazy. Zapewne jednym zapytaniem SQL
//unset($this); // to nie będzie działać - trzeba sunąć obiekt na zewnątrz
}
public function __destruct()
{
print "Usuwanie obiektu Article (id = {$this->id})" . PHP_EOL
; // Podejrzymy sobie, kiedy faktycznie niszczymy obiekt }
}
class Articles
{
public function deleteArticle(Article &$article)
{
$article->delete(); // PROXY
//unset($article); // to też nie zadziała;
$article = null; // ale to już działa i uaktywnia destruktor
}
}
// Stwórzmy obiekcik Article - załóżmy, że wyciągnęliśmy go wcześniej z bazy.
$article = new Article();
$article->setId(1);
$manager = new Articles();
$manager->deleteArticle($article);
var_dump($article); // Dzięki $article = null; $article nie jest już obiektem (unset() nie działa w ten sposób niestety). ?>
Czego wynikiem będzie:
Cytat
DELETE FROM articles WHERE id = 1
Usuwanie obiektu Article (id = 1)
NULL
No dobra, to nie jest zbyt skomplikowane. Wygląda na to, że lepiej i szybciej by było użyć samego $article->delete(). Prawdziwy sens pokazuje się gdy chciałbyś usunąć więcej niż jeden obiekt Article.
<?php
// Łopatologicznym sposobem by to wyglądało tak
for ($i = 1; $i <= 10; $i++) {
// torzymy kilka obiektów artykułów. Załóżmy, że wyciągnliśmy je z bazy.
$articles[$i] = new Article();
$articles[$i]->setId($i);
}
foreach($articles as $article)
{
$article->delete();
};
?>
Czego wynikiem będzie:
Cytat
DELETE FROM articles WHERE id = 1
DELETE FROM articles WHERE id = 2
DELETE FROM articles WHERE id = 3
DELETE FROM articles WHERE id = 4
DELETE FROM articles WHERE id = 5
DELETE FROM articles WHERE id = 6
DELETE FROM articles WHERE id = 7
DELETE FROM articles WHERE id = 8
DELETE FROM articles WHERE id = 9
DELETE FROM articles WHERE id = 10
Usuwanie obiektu Article (id = 1)
Usuwanie obiektu Article (id = 2)
Usuwanie obiektu Article (id = 3)
Usuwanie obiektu Article (id = 4)
Usuwanie obiektu Article (id = 5)
Usuwanie obiektu Article (id = 6)
Usuwanie obiektu Article (id = 7)
Usuwanie obiektu Article (id = 8)
Usuwanie obiektu Article (id = 9)
Usuwanie obiektu Article (id = 10)
NULL
Niefajnie, prawda? 10 zapytań... na pomoc biegnie obiekt Articles.
<?php
// Dodajmy tę metodę do klasy Articles
public function deleteArticles
(array &$articles) {
foreach($articles as $article)
{
$ids[] = $article->getId();
}
print "DELETE FROM articles WHERE id In (" . implode(',', $ids) . ")" . PHP_EOL
; }
?>
Teraz, gdy użyjemy Articles::deleteArticles()
<?php
for ($i = 1; $i <= 10; $i++) {
// torzymy kilka obiektów artykułów. Załóżmy, że wyciągnliśmy je z bazy.
$articles[$i] = new Article();
$articles[$i]->setId($i);
}
$manager = new Articles();
$manager->deleteArticles($articles);
var_dump($articles); // Dzięki $article = null; $article nie jest już obiektem (unset() nie działa w ten sposób niestety). ?>
Cytat
DELETE FROM articles WHERE id In (1,2,3,4,5,6,7,8,9,10)
Usuwanie obiektu Article (id = 1)
Usuwanie obiektu Article (id = 2)
Usuwanie obiektu Article (id = 3)
Usuwanie obiektu Article (id = 4)
Usuwanie obiektu Article (id = 5)
Usuwanie obiektu Article (id = 6)
Usuwanie obiektu Article (id = 7)
Usuwanie obiektu Article (id = 8)
Usuwanie obiektu Article (id = 9)
Usuwanie obiektu Article (id = 10)
array(0) {
}
Tylko jedno zapytanie!
To jest oczywiście bardzo, bardzo prosty przykład, ale ilustruje co można zyskać na rozbudowie zależności między obiektami.