2013-09-21, 18:43
  #1
Medlem
Tjena.
Jag har en liten fråga gällande classer. Det känns som att jag tänker lite fel när jag kodar och tänkte höra hur ni gör.

Jag kör som exempel med PDO. Jag har skapat en singleton class, static database för att skapa ett PDO objekt och har också skapat olika metoder för att hämta data etc.

Sedan har jag en annan class, som exempel customer:

Kod:
<?php

    
class Customer
    
{
        
//VARIABLES
        
private $sql;
        
        public function 
__construct()
        {
            
$this->sql Database::getInstance();
        }

        public function 
get_all_customers()
        {
            
$this->sql->query("SELECT * FROM customer");
            
$this->sql->execute();
            return 
$this->sql->returnSet();
        }
    
    }

?>

I classen customer så hämtar jag en instance av classen database som ska sköta alla databas anrop. Sedan skapar jag metoder i den classen som är till för classen, som exempel get_all_customers().

Gör jag rätt, eller kan man sköta det på ett snyggare sätt?
Citera
2013-09-21, 18:47
  #2
Medlem
Egentligen kallas detta för ett antimönster.

"The real pros" rekommenderar inte att man använder singetons. Det förstör poängen med objektorienterad programmering.

Det rekommenderas att man skapar sin __construct typ såhär:
Kod:
public function __construct(Database $db) { 
    
$this->sql $db


Hur många som verkligen har energin att göra så är en annan fråga, men att använda singletons är ett antimönster
Citera
2013-09-21, 19:01
  #3
Medlem
Forgs avatar
Det låter som att du försöker skapa en ORM i mina ögon. Skulle tipsa dig om att använda en befintlig ORM istället. Det finns naturligtvis en massa lösa ORM:er som Doctrine så du inte behöver använda ett ramverk om du inte vill.

Annars skulle jag tipsa om Laravel:
http://laravel.com/docs/eloquent

PhalconPHP för prestanda:
http://phalconphp.com/en/

Eller om du vill ha något lite mer minimalistiskt så finns Silex:
http://silex.sensiolabs.org/
Citera
2013-09-21, 20:14
  #4
Medlem
Citat:
Ursprungligen postat av Daudodidi
Egentligen kallas detta för ett antimönster.

"The real pros" rekommenderar inte att man använder singetons. Det förstör poängen med objektorienterad programmering.

Det rekommenderas att man skapar sin __construct typ såhär:
Kod:
public function __construct(Database $db) { 
    
$this->sql $db


Hur många som verkligen har energin att göra så är en annan fråga, men att använda singletons är ett antimönster

men att inte köra databas instancen som singleton är ju inte så smart, då skapar men flera anslutningar till databasen istället för att använda den öppna anslutningen.

Eller har jag fel?
__________________
Senast redigerad av newone 2013-09-21 kl. 20:16.
Citera
2013-09-21, 23:22
  #5
Medlem
Citat:
Ursprungligen postat av newone
men att inte köra databas instancen som singleton är ju inte så smart, då skapar men flera anslutningar till databasen istället för att använda den öppna anslutningen.

Eller har jag fel?
Principen är att databasinstansen skapas utanför din Customer-klass. Sen bifogar du den till din Customer-construct() - och till andra klassinstanser som du skapar och som kan ha nytta av den. Så den kan återanvändas.
Citera
2013-09-22, 05:18
  #6
Medlem
Citat:
Ursprungligen postat av newone
men att inte köra databas instancen som singleton är ju inte så smart, då skapar men flera anslutningar till databasen istället för att använda den öppna anslutningen.

Eller har jag fel?
Objekt skapar inte kopior som andra variabler, utan använder exakt samma objekt. Det är en direkt referens, så ingen dubbel anslutning skapas.

Använder man en gammal version av PHP får man dock skapa en direkt referens genom &-tecknet
Citera
2013-09-22, 10:11
  #7
Medlem
Ok tackar.
Sista fråga som jag har nu är:

Om jag har en user klass, ska jag göra mina databas-anslutningar direkt från den klassen, eller ha en modell-klass som user klassen ärver istället.

Har sätt vissa göra så för att separera alla db connections från själva klassen. Istället skapar dem funktioner i modell klassen som exempel deleteUser(23); för att göra en query i själva user klassen.

Vad tror ni om det
Citera
2013-09-22, 22:12
  #8
Medlem
Voldemort2s avatar
"The gang of four" är ganska duktiga har jag hört

De använder "Singleton".
Citera
2013-09-23, 23:44
  #9
Medlem
Citat:
Ursprungligen postat av newone
Ok tackar.
Sista fråga som jag har nu är:

Om jag har en user klass, ska jag göra mina databas-anslutningar direkt från den klassen, eller ha en modell-klass som user klassen ärver istället.

Har sätt vissa göra så för att separera alla db connections från själva klassen. Istället skapar dem funktioner i modell klassen som exempel deleteUser(23); för att göra en query i själva user klassen.

Vad tror ni om det

Det finns flera olika designmönster, alla har sina fördelar och nackdelar, i slutändan handlar det om vad som är mest effektivt för dig.

Eloquent som någon nämnde innan är en ActiveRecord implementation.

Det du beskriver ovan låter som en Data Mapper implementation, du har en Mapper som håller databasen och själva objektet frånskilda.

User
username
password

UserMapper
insert
update
delete

User -> UserMapper <-- Databasen
Citera
2013-10-08, 15:36
  #10
Medlem
The Barrs avatar
Man kan inte säga rakt av att en singleton alltid är en dålig approach. Det beror helt på hur resten av din kod ser ut och hur du ska använda den. Mycket av kritiken mot singletons kommer ifrån att det kan vara svårt att skriva automatiska tester för sådan kod, vilket ses som väldigt viktigt idag.

Sen kan du alltid använda en singleton oavsett om du använder den globalt eller om du skickar med instansen som parameter till klasserna som använder den. Däremot är det oftast en bra idé att inte tillåta klasser att ha en externa (globala) referenser i och med att det är en strategi som kan ställa till det ordentligt om man inte håller tungan rätt i mun. Då är det alltså oftast bättre att skicka med allt som klassen/dess metoder behöver som parametrar istället.

Citat:
Ursprungligen postat av Daudodidi
Objekt skapar inte kopior som andra variabler, utan använder exakt samma objekt. Det är en direkt referens, så ingen dubbel anslutning skapas.

Använder man en gammal version av PHP får man dock skapa en direkt referens genom &-tecknet

Det där är svårt att inte tolka fel. Objekt som man kopierar och skickar runt i olika variabler är samma objekt, men instansierar du flera objekt av en klass är det naturligtvis olika objekt.
Citera
2013-10-10, 09:17
  #11
Medlem
Citat:
Ursprungligen postat av Voldemort2
"The gang of four" är ganska duktiga har jag hört

De använder "Singleton".
Visst. Men hämta inte fram instansen direkt i klasser utan mata klasser med de beroenden de har. Typ vad Strategy (ockås GoF) går ut på .

Genom att ha MySingleton::getInstance() lite överallt har man skapat massa beroenden till just MySingleton, vilket är dålig OO. Koda mot abstraktioner (interface), inte implementationer.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in