Versio

getField i.p.v. getName

Overzicht Reageren

The Ultimate

The Ultimate

16/01/2011 23:10:57
Quote Anchor link
Dag mensen,

Ben bezig met het opzetten van een OOP website. Uiteraard heb ik meerdere database tabellen met gegevens. Nu kan ik voor elke column in een bepaalde table het volgende doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    public function getZipcode()
    {

        if(!$result = $this->_db->query("SELECT zipcode FROM debtors WHERE id = '".$this->_id."'")) {
            throw new PDOException('Er is een fout opgetreden.');
        }
else {
            foreach ($result as $row) {
                return $row['zipcode'];
            }
        }
    }
//->getZipcode()
?>

Maar is het niet veel handiger om dit te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    public function getField($field)
    {

        if(!$result = $this->_db->query("SELECT $field FROM debtors WHERE id = '".$this->_id."'")) {
            throw new PDOException('Er is een fout opgetreden.');
        }
else {
            foreach ($result as $row) {
                return $row[$field];
            }
        }
    }
//->getField()
?>


Graag jullie gedachten hierover...
Gewijzigd op 16/01/2011 23:12:04 door The Ultimate
 
PHP hulp

PHP hulp

24/05/2012 19:46:22
Gesponsorde koppelingen:
 
Jens V

Jens V

16/01/2011 23:20:46
Quote Anchor link
Als je met klassen werkt, is het dan niet de bedoeling dat je bij het opbouwen van de pagina je object inlaadt, en pas je db opnieuw contacteert als je iets verandert?
 
Bas Cost Budde

Bas Cost Budde

16/01/2011 23:39:51
Quote Anchor link
Zelfs zonder klassen is dat nog de bedoeling; iets veranderen kan toch pas met een nieuw request.

Maar Ultimate, beste kerel, middenin een foreach een return, dat loopt niet he.

Ik ben het met de essentie van je vraag eens. Als je voor elk veld een zelfde getter nodig hebt, kan dat best met de veldnaam als een parameter.

Let op 'zelfde'. Ik heb best objecten die sommige tabelvelden helemaal niet afgeven, of er stiekem eerst een bewerking op loslaten. Dan kun je __call gebruiken. Laten we afspreken dat je "veld" altijd opvraagt door $object->getVeld() te doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
public function __call($name, $args) {
  if (substr($name, 0, 3) == 'get') {
    $prop = substr($name, 3);
    if (isset($this->$prop)) return $this->prop;
    trigger_error(__CLASS__ .' heeft geen '.$prop);
  }
}
 
The Ultimate

The Ultimate

17/01/2011 08:38:26
Quote Anchor link
Jens V op 16/01/2011 23:20:46:
Als je met klassen werkt, is het dan niet de bedoeling dat je bij het opbouwen van de pagina je object inlaadt, en pas je db opnieuw contacteert als je iets verandert?
Bas Cost Budde op 16/01/2011 23:39:51:
Zelfs zonder klassen is dat nog de bedoeling; iets veranderen kan toch pas met een nieuw request.
Ik denk dat Jens bedoelt te zeggen dat je bij het instantieren van een object meteen alle mogelijke waardes uit de database in het object plaatst zodat je er de hele pagina bij kunt en dus niet telkens opnieuw een sql-query hoeft uit te voeren. Ik weet niet of dat de bedoeling is (lijkt me eigenlijk wel sneller) en hoe ik dat dan vorm moet geven. Tips zijn welkom.

Bas Cost Budde op 16/01/2011 23:39:51:
Maar Ultimate, beste kerel, middenin een foreach een return, dat loopt niet he.
Ja, je hebt ook helemaal gelijk. Die return hoort daar niet. Stom van me. Soms dan zit je zo vast in je gedachte. Het gaat in dit geval niet fout omdat het telkens om 1 waarde gaat maar dat maakt het inderdaad nog niet goed. Bedankt dat je me daarop hebt gewezen. Zal het aanpassen.

EDIT:
Ik dacht "dat pas ik wel even aan". Niet dus. Hoe kan ik onderstaande foreachloop nou het beste vervangen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    public function getId()
    {

        if(!$result = $this->_db->query("SELECT id FROM debtors WHERE id = '".$this->_id."'")) {
            throw new PDOException('Er is een fout opgetreden.');
        }
else {
            foreach ($result as $row) {
                return $row['id'];
            }

        }
    }
//->getId()
?>


Bas Cost Budde op 16/01/2011 23:39:51:
Let op 'zelfde'. Ik heb best objecten die sommige tabelvelden helemaal niet afgeven, of er stiekem eerst een bewerking op loslaten. Dan kun je __call gebruiken. Laten we afspreken dat je "veld" altijd opvraagt door $object->getVeld() te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
public function __call($name, $args) {
  if (substr($name, 0, 3) == 'get') {
    $prop = substr($name, 3);
    if (isset($this->$prop)) return $this->prop;
    trigger_error(__CLASS__ .' heeft geen '.$prop);
  }
}
?>
Ok, ik zie wat je me probeert te zeggen. Kan ik deze call gewoon in mijn object-class plaatsen samen met mijn algemene fieldgetter en dan een veld opvragen d.m.v. $obj->getField()? En wat is het nut dan precies van deze __call()?
Gewijzigd op 17/01/2011 10:35:35 door The Ultimate
 
Bas Cost Budde

Bas Cost Budde

17/01/2011 23:22:45
Quote Anchor link
* foreach: sja, wat wil je? Je query lijkt door de WHERE 1 record op te halen, klopt dat?

__call is een magische methode. Zoek maar op, is leuk. Hij gaat af wanneer je een methode op een object aanroept die je niet gedefinieerd hebt (of die niet bereikbaar is, dwz niet publiek, of indien uit een subklasse aangeroepen, private).

Je vraagt een veld 'huisnummer' op met $obj->getHuisnummer, zonder dat je die methode hoeft te schrijven. Hm, doe in dat geval ook nog even strtolower() bij de toekenning aan $prop; ik heb zelfs een methode die camelcase omzet in underscored, als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
    private function flatcamel($name) {
    // om het helemaal mooi te maken, camelcaps weer omzetten naar underscores. Oeps: als de eerste letter een hoofd- is, niet underscoren
        return strtolower(preg_replace('/(?!^)[A-Z]/', '_\0', substr($name, 3)));
    }
 
Pim -

Pim -

18/01/2011 00:11:44
Quote Anchor link
In plaats van die foreach kan je $result->fetchAssoc() oid gebruiken.
 
Rudie dirkx

rudie dirkx

18/01/2011 00:23:23
Quote Anchor link
Quote:
Maar Ultimate, beste kerel, middenin een foreach een return, dat loopt niet he.


Waarom is een return binnen een foreach slecht? Als je een onbekend aantal elementen hebt - laten we zeggen dat het er heeel veel zijn - en de eerste van de elementen die iets speciaals heeft, is de uitkomst van je function... Wat is er dan perfecter dan een return in een foreach?

flatcamel wordt trouwens ook wel een slug genoemd. Of sluggen of slugifyen of zoiets.
Gewijzigd op 18/01/2011 00:23:56 door rudie dirkx
 
Bas Cost Budde

Bas Cost Budde

18/01/2011 21:44:34
Quote Anchor link
Rudie, mijn opmerking had een nauwere scope dan jouw wedervraag. Ultimate probeert iets dat hij op die manier niet goed uitdrukt.
Dan nog heb ik liever geen return in een foreach. Als je heel veel elementen ophaalt en er dan toch maar een behandelt, deugt je algoritme niet voor de taak onderhanden. (En je laat wel heel veel werk liggen voor de garbage collector, en als C-student had je een vette onvoldoende van me gekregen op een tentamen. Maar dat helemaal terzijde :) )


slug, wat is dat ook alweer? Ik kwam het tegen in een CMS, als een string die direct in de url gezet mag worden, in tegenstelling tot de productnaam die spaties en dergelijke ellende kan bevatten.
 



Overzicht Reageren

Get Adobe Flash player