getters setters public properties

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Social Media Specialist

Social Media Specialist locatie: Rotterdam (Zuid Holland) Wij zoeken op korte termijn een nieuwe collega, een social media specialist/ adviseur sociale media (24 uur), voor ons sprankelende team Communicatie van CJG Rijnmond. Onze focus ligt op het informeren en binden van onze in- en externe klanten en stakeholders en het versterken van onze naamsbekendheid en zichtbaarheid. Dat doen we in nauwe samenwerking met elkaar. Over de functie Ons team bestaat uit 7 communicatieprofessionals met ieder een eigen expertise. Als lid van het online team ben je verantwoordelijk voor het ontwikkelen, uitvoeren en analyseren van onze socialemediastrategie. Ook stel je campagnes

Bekijk vacature »

Senior Airport Developer ( System engineer)

De functie Nice to know (you) De nieuwe A-pier wordt de duurzaamste van Schiphol. Als deze af is ligt er 4000 vierkante meter zonnepanelen op het dak. En de toiletten? Die spoelen door met regenwater. we gaan ervoor: het creëren van de meest duurzame en hoogwaardige luchthavens ter wereld. een toekomstbestendig en duurzaam Schiphol. Daar werken we elke dag hard aan in team Development & Sustainability. Jij bent regisseur, expert én aanjager van de ontwikkeling van Schiphol. Connecting your world Hoe maak je de ambities en doelstellingen van Schiphol concreet in een project? De waarde voor Schiphol naar eisen die

Bekijk vacature »

Als Front-end developer samenwerken met de beste c

Functie Momenteel zijn we voor één van de projecten bij hun key partner, een voorloper in de energiesector, op zoek naar gedreven Front-end developers. Ze nemen de lead in dit project en werken uitsluitend met vooruitstrevende technologieën. Ze verwachten dat de technologie die hier wordt ontwikkeld uiteindelijk door veel meer grote corporates, in verschillende sectoren zal worden toegepast. Dit is dan ook een heel uitdagend project om aan mee te gaan werken. Het team bestaat o.a. uit User Experience designers, Data Scientists en Software Engineers. De consultants en ontwikkelaars werken volgens de Design Thinking methode waarbij de eerste stappen van

Bekijk vacature »

Software developer

Werkzaamheden voor jou als software developer Voor een goede relatie in de regio Zwolle (meerdere locaties) zoeken wij een software developer die betrokken is bij de ontwikkelcyclus en verantwoordelijk is voor het testen en keuren van nieuwe en geoptimaliseerde software. In deze functie ben je in de implementatiefase de persoon die risico's beoordeelt en intern oplossingen aanbrengt om risico's te verkleinen. Binnen het ontwikkelteam van de software ben je een belangrijke schakel waar je intensief meewerkt met scrum. Het voorkomen van bugs in de programma's en het bevorderen van gebruiksvriendelijkheid voor eindklanten zijn voor jou een uitdaging en geeft voldoening

Bekijk vacature »

.NET Developer

Functieomschrijving Ben jij klaar voor de volgende stap in jouw carrière? Kom werken bij dit kleine softwarebureau en werk aan de gaafste maatwerk projecten. Je komt te werken in een klein development team en werk nauw samen met elkaar, om maatwerk software te leveren en bij te dragen aan bedrijfsautomatiseringen. Je gaat werken met de Microsoft stack en technieken als .NET, C#, Entity, MVC, SQL server. In de functie krijg je veel vrijheid om zelf beslissingen te nemen en je hebt impact op de bedrijfsprocessen. Bedrijfsprofiel Dit familiebedrijf bestaat al ruim 20 jaar. Zij hebben een vast netwerk van klanten,

Bekijk vacature »

Robot Programmeur

In het kort Drie redenen waarom deze vacature uniek is! Modern, innovatief en Informeel bedrijf waar veel mogelijk is Werken met diverse robot merken Meehelpen met inbedrijfstellingen bij de klant De organisatie Hier ga je aan de slag Dit groeiende bedrijf van totaaloplossingen in de automatisering van productieprocessen, is hoofdzakelijk actief in de Benelux. Vanuit het kantoor in regio Amersfoort worden veel oplossingen geboden in de vorm van robotica. Geen project is hetzelfde wat garant staat voor bijzonder veel afwisseling. De bedrijfsgrootte is ongeveer 80 man. Van gerobotiseerde machinebeladingen tot aan assemblage automatiseringen wordt vanuit krachtige engineering maatwerk equipment geleverd.

Bekijk vacature »

Java Programmeur

Functie Heb jij altijd al samen willen werken met ervaren java ontwikkelaars dan hebben wij hier de ultieme kans voor jou! Voor een opdrachtgever in omgeving van Naaldwijk zijn wij op zoek naar uitbreiding van het vaste ontwikkel team. Je zult je hier voornamelijk bezig gaan houden met; Wijzigingsverzoeken van klanten uitvoeren, hier wordt je diep in betrokken; Samen met consultants sluit je aan bij gesprekken met klanten, voor alle projecten; Je schakelt veel met consultants, wat is de behoefte van de klant? Hoe kan je hierop integreren?; Het framework moet naar de Cloud gebracht worden, je wordt betrokken bij

Bekijk vacature »

Junior .NET developer

Functie Als junior .NET developer start jij in een development team met twee ervaren software ontwikkelaars. Jouw persoonlijke ontwikkeling is voor ons erg belangrijk en jij gaat dan ook meelopen met onze Senior .NET ontwikkelaar die jou met zijn kennis en ervaring een goede begeleiding kan aanbieden. Als team zijn jullie verantwoordelijk voor het schrijven van software voor onze toonaangevende Automatiseringssystemen. Jij gaat aan de slag met de onderhoud van de kernsoftware, ondersteund de software van derden door het gebruik van onze webservices en als team zijn jullie verantwoordelijk voor het ontwikkelen van onze backend oplossingen. Wij maken op dit

Bekijk vacature »

PHP ontwikkelaar

Functie Jij komt te werken in een development team van 9 man. Het grootste deel doet back end development en daarnaast is er 1 teamlead en 1 tester in het team. Dit Agile team is van groots belang voor de organisatie omdat zij voornamelijk alle eigen systemen in-house ontwikkelen. Naast het door ontwikkelen van het bestaande platform en de software die daarbij komt kijken, zul jij je ook bezighouden met het realiseren en opzetten van nieuwe projecten binnen het bedrijf. Je staat nauw met de klant in contact om zo hun wensen zo goed mogelijk te kunnen realiseren. Daarnaast ontwikkel

Bekijk vacature »

C#.NET Developer

Dit ga je doen Ontwikkelen van de Back-end in .NET6 / C# en WebAPI (Focus);) Ontwikkelen van de Front-End in Nodje.js en Angular (secundair); Opstellen van een technisch ontwerp; Testen, documenteren en implementeren van de nieuwe applicatie; Verzorgen van de nazorg, na de implementatie; Het oplossen van bugs en incidenten. Hier ga je werken Als C#.NET Developer binnen deze organisatie kan jij het verschil maken. Zij werken momenteel nog met programmatuur die is ontwikkeld in C++. Hiervan gaan zij afscheid nemen zodra alle nieuwe software in C#.NET geschreven is. Een grootschalig en langdurig project. Voor hen is deze software van

Bekijk vacature »

Airport Developer / System engineer

De functie Als onze nieuwe Airport Developer / System Engineer is je doel om uit nieuwbouw- en onderhoudsprojecten maximale waarde te creëren voor Schiphol Group en haar stakeholders. Vanuit je visie en expertise, maar ook (technologische) ontwikkelingen, wetgeving en beleid vertaal je klantwensen naar een gedegen programma van eisen. In de planontwikkelingsfase werk je nauw samen met Plan Ontwikkelaars om je kennis in te brengen ten behoeve van de kwaliteit van het investeringsvoorstel. Je overlegt met diverse partijen, stelt de vraag achter de vraag en verbindt zo de belangen van de luchthaven, proceseigenaar en asseteigenaar om tot een gedragen ontwikkelopgave

Bekijk vacature »

.NET Developer

Dit ga je doen Tot jouw takenpakket behoort onder andere: Webapplicaties ontwerpen, bouwen, testen en implementeren in .NET/C#.; Ontwikkelen, implementeren en beheren van maatwerkapplicaties; Onderhouden en beheren van standaardpakketten; Onderzoeken en beoordelen van nieuwe technieken. Hier ga je werken Als .NET ontwikkelaar kom je te werken bij een grote semioverheidsinstelling in Nijmegen. De organisatie staat garant voor het leveren van onderwijs en les- en onderzoeksmateriaal voor duizenden betrokkenen. De organisatie wil bijdragen aan een gezonde, vrije wereld met gelijke kansen voor iedereen. Binnen de teams hangt een open en collegiale cultuur met veel aandacht voor een prettige en sociale werksfeer.

Bekijk vacature »

Ervaren PHP Developer

Functie omschrijving Jelling IT zoekt ervaren PHP developer! Voor een organisatie in de regio Rhenen zijn wij op zoek naar een ervaren PHP developer die gaat functioneren als een verlengstuk van de klant. Jij bent iemand die technisch complexe zaken met enthousiasme aanvliegt. Je bent in staat om aan meerdere projecten te werken en werkt graag met de nieuwste technieken. In deze functie werk je veel samen met front-end developers en stel je alles in het werk om grote verschillen voor de klanten teweeg te brengen. Verder ben jij iemand die graag zichzelf uitdaagt en die altijd de beste wilt

Bekijk vacature »

.net developer

Hoi! Wij zijn auto.nl en wij verkopen auto's online. je bestelt bij ons een auto net zo makkelijk als een spijkerbroek. En bevalt ie niet? Dan stuur je 'm gewoon weer terug. En dat we dat goed doen bewijst onze hoge klanttevredenheid van een 9,3. Nu maken we de volgende stap bij auto.nl. We starten met fysieke winkels. Online zoeken, offline bekijken. Maar nog altijd, geen gedoe! Gewoon eerlijk, transparant en zonder zorgen een auto kopen.. Maar om dat waar te blijven maken en nóg beter te worden, zoeken we uitbreiding van ons development team. Wat ga je precies doen?

Bekijk vacature »

Software developer (PHP) - Utrecht centrum

Functie Ieder onderdeel van de software draait op aparte servers en het bestaat dus echt uit verschillende componenten. Het team bestaat uit 4 developers, een klein team dus met korte lijnen. Alles in intern ontwikkeld en je werkt aan alle facetten. Van uitbreiding van de core tot maatwerk voor de klant. Ook liggen er verschillende uitdagingen op servervlak en databases. Je zult de eerste periode veel samenwerken met de lead developer om vervolgens echt je gang te gaan binnen de software. In het team streven ze naast de hoogst haalbare kwaliteit. Hiervoor werken ze nauw met elkaar samen en levert

Bekijk vacature »

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

16/03/2013 21:22:58
Quote Anchor link
De laatste tijd ben ik vaak bezig met het (proberen te) optimaliseren van snelheid, en ik kom dan ook regelmatig met vragen die daar mee te maken hebben. Vandaag kreeg ik van iemand op die forum de tip om in plaats van getters en setters gebruik te maken van public properties. Dit scheelt een hoop methods en ook de nodige regels code.

Maar... is het gebruik van public properties nu wel of niet goed? Ik heb deze vraag een tijdje geleden ook gesteld, maar ben nu aan het twijfelen gebracht. Op internet lees je zeer veel artikelen waarin gesteld wordt dat getters en setters "evil" zijn.

Hoe doen jullie het? Wie gebruikt hier voor alle properties getters en setters? En wie gebruikt public properties? En set je die dan in de __construct?

Ik weet het even niet meer, dus ik ben benieuwd naar jullie meningen... ik heb even wat nieuwe input nodig, dus ik hoop op de nodige reacties. Alvast bedankt!
 
PHP hulp

PHP hulp

19/04/2024 17:05:13
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/03/2013 01:38:46
Quote Anchor link
Ik ben juist afgestapt van public properties. Mijn ervaring is dat het gebruik van getters en setters (allemaal aparte methods) veel fijner is. zo zet ik in een datum setter de datum-string direct om in een datum-class.
De constructor gebruik ik enkel om direct properties te setten vanuit de parameters die meegegeven worden en om properties te voorzien van een default value.
 
Ward van der Put
Moderator

Ward van der Put

17/03/2013 09:32:46
Quote Anchor link
Frank Nietbelangrijk op 17/03/2013 01:38:46:
Ik ben juist afgestapt van public properties. Mijn ervaring is dat het gebruik van getters en setters (allemaal aparte methods) veel fijner is. zo zet ik in een datum setter de datum-string direct om in een datum-class.
Dat is een sterk argument, maar ook een andere argumentatie: je bent niet afgestapt van public properties, maar overgestapt op veel betere setters.

Nut en noodzaak van naïeve setters en naïeve getters mag je wel in twijfel trekken. Om bij het voorbeeld van Frank te blijven: de volgende Bar doet niets meer met de $Geboortedatum dan een variabele heen en weer schuiven in de getter en setter. Ga je hiervan de snelheid testen, dan is de klasse Foo met een public property veel sneller dan de klasse Bar met naïeve setter en getter.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
// Openbare Foo
class Foo
{
    public $Geboortedatum;
}



// Naïeve Bar
class Bar
{
    protected $Geboortedatum;

    public function setGeboortedatum($param)
    {

        $this->Geboortedatum = $param;
    }


    public function getGeboortedatum()
    {

        return $this->Geboortedatum;
    }
}


function
DoeTest()
{

    $aantalHerhalingen = 100000;

    $start = microtime(true);
    for ($i = 0; $i < $aantalHerhalingen; $i++) {
        $obj = new Foo();
        $obj->Geboortedatum = '2013-04-01';
        $str = $obj->Geboortedatum;
    }

    echo 'Foo: ', (microtime(true) - $start) * 10, "<br />\n";

    $start = microtime(true);
    for ($i = 0; $i < $aantalHerhalingen; $i++) {
        $obj = new Bar();
        $obj->setGeboortedatum('2013-04-01');
        $str = $obj->getGeboortedatum();
    }

    echo 'Bar: ', (microtime(true) - $start) * 10, "<br />\n";
}


$aantalTests = 5;
for($i = 0; $i < $aantalTests; $i++){
    echo "<br />\n<br />\n== Test #", ($i + 1), " ==<br />\n";
    DoeTest();
}


/*

== Test #1 ==
Foo: 1.6562294960022
Bar: 3.4554100036621

== Test #2 ==
Foo: 1.473069190979
Bar: 3.4723591804504

== Test #3 ==
Foo: 1.4610910415649
Bar: 3.473789691925

== Test #4 ==
Foo: 1.5618586540222
Bar: 3.4958720207214

== Test #5 ==
Foo: 1.4596486091614
Bar: 3.5025119781494

*/

[/code]
Gewijzigd op 17/03/2013 09:33:28 door Ward van der Put
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/03/2013 10:28:59
Quote Anchor link
Ward, dank je wel voor de heldere argumentatie.
 
Ozzie PHP

Ozzie PHP

17/03/2013 15:23:26
Quote Anchor link
Dankjewel voor jullie reacties!

Ward, jouw uitkomsten zijn volgens mij niet in secondes?
In secondes zou je dit krijgen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
== Test #1 ==
Foo: 0.16562294960022
Bar: 0.34554100036621

Dit is bij 100.000 herhalingen. In de praktijk is het dus iets sneller, maar het zijn ook weer geen MEGA verschillen.

Maar goed, alles is meegenomen. Dan kom ik bij de volgende vraag:
Wel of niet overal aparte setters voor gebruiken? Ik gebruik nu om vanuit de construct een (naïeve) property te setten een aparte private setter method. Niet alleen voor properties, maar voor alles wat vanuit de constructor geset moet worden gebruik ik private setter methods. Dus bijv. zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
public function __construct($foo, $bar) {
  $this->setFoo($foo) // dit is een naïeve setter, $this->foo = $foo;
  $this->setBar($bar) // dit is een naïeve setter, $this->bar = $bar;
  $this->setServices(); // dit is een "intelligente" setter met logica
  $this->setRoutes(); // dit is een "intelligente" setter met logica
}
?>

Nu heb ik weer een andere benchmark gedaan...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
class Foo {

    private $foo0;
    private $foo1;
    private $foo2;
    //...
    private $foo9;

    public function __construct($foo) {
        $this->setFoo0($foo);
        $this->setFoo1($foo);
        $this->setFoo2($foo);
        // ...
        $this->setFoo9($foo);
    }


    private function setFoo0($foo) {
        $this->foo0 = $foo;
    }


    private function setFoo1($foo) {
        $this->foo1 = $foo;
    }


    private function setFoo2($foo) {
        $this->foo2 = $foo;
    }


    // ...

    private function setFoo9($foo) {
        $this->foo9 = $foo;
    }

}


class Bar {

    private $bar0;
    private $bar1;
    private $bar2;
    // ...
    private $bar9;

    public function __construct($bar) {
        $this->bar0 = $bar;
        $this->bar1 = $bar;
        $this->bar2 = $bar;
        // ...
        $this->bar9 = $bar;
    }

}

?>

1.000 aanroepen van new Foo('foo') = 0,00677 seconden
1.000 aanroepen van new Bar('bar') = 0,00227 seconden

Rechtstreeks iets setten vanuit de constructor is dus sneller dan het gebruik van aparte (private) setters. En dat brengt mij dan tot de volgende gedachte:

* Moet je in plaats van private setters niet gewoon ALLES vanuit de constructor zelf setten? Of is dat geen goed OOP? Graag jullie meningen hierover.

In plaats van dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
public function __construct($foo, $bar) {
  $this->setFoo($foo) // dit is een naïeve setter, $this->foo = $foo;
  $this->setBar($bar) // dit is een naïeve setter, $this->bar = $bar;
  $this->setServices(); // dit is een "intelligente" setter met logica
  $this->setRoutes(); // dit is een "intelligente" setter met logica
}
?>

...zou je dan zoiets krijgen:

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 __construct($foo, $bar) {
  // Set properties.
  $this->foo = $foo;
  $this->bar = $bar;
  // Set services.
  // ... hier komen een aantal regels code

  $this->services = $services;
  // Set routes.
  // ... hier komen een aantal regels code

  $this->routes = $routes;
}

?>

Wat vinden jullie daarvan? Dus in plaats van diverse setters aanroepen vanuit de constructor, rechtstreeks alles in de constructor zelf setten?

Graag jullie reacties!
 
Willem vp

Willem vp

01/04/2013 09:07:04
Quote Anchor link
Beetje late reactie ;-) maar mijn mening is dat als je een setter alleen gebruikt in een constructor, die setter dan geen bestaansrecht heeft.
 
Erwin H

Erwin H

01/04/2013 10:09:59
Quote Anchor link
Ozzie, volgens mij ben je nu echt op het punt gekomen dat je je moet gaan afvragen of OOP wel geschikt is voor jouw applicatie. Jouw obsesieve drang naar performance verbetering leidt je nu zelfs naar het in twijfel trekken van een belangrijk punt van een OOP applicatie. Misschien wel het belangrijkste voordeel van OOP.

OOP gebruik je doorgaans niet omdat je de snelst mogelijke applicatie wilt hebben, maar gebruik je omdat het grote voordelen biedt in development. Door de modulaire opbouw kan je grote delen van je code hergebruiken en krijg je enorme flexibiliteit in je applicatie waardoor je eenvoudig delen kunt uitwisselen. In dit licht bezien heb ik al eens uiteengezet waarom wat mij betreft public properties (en zelfs protected) uit den boze zijn. Dat is geen algemene waarheid, maar volgens mij begreep je wel de gedachtegang erachter.

Als je nu echter dat voordeel wilt opgeven alleen maar om een performance verbetering te krijgen (waarvan je nog niet eens weet of het nodig is want je hebt nog helemaal niets draaien om te benchmarken), dan kan je beter terug naar spaghetti code. Dat is namelijk altijd sneller dan OOP. Het kost je veel meer tijd in de ontwikkeling, maar blijkbaar is dat niet meer jouw belangrijkste argument.
 
MayDay PHP

MayDay PHP

01/04/2013 12:08:02
Quote Anchor link
Waarom zou je in godsnaam getters and setters gebruiken? Wel ik denk dat het gewoon gemakkelijker is om door de hele applicatie ->getUserId() in plaats van ->userId aan te roepen en wel omdat als er ooit iets fout gaat, kun je gewoon ->getUserId() aanpassen.

Neem nu aan dat je de gebruikers laat chatten en er worden geen html tags gebruikt kunt je gewoon ->getMessage() aanspreken en die setter doet dan op zijn beurt return strip_tags($this->message). Anders zul je door de hele applicatie echo strip_tags($this->message) moeten doen en als er dan andere fouten aan het licht komen mag je weer beginnen met alle $this->message's te vinden.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php

class User {

    private $userId;
    private $insertDatetime;

    public function setUserId($userId) {
        $this->userId = $user;
    }


    public function setInsertDatetime($insertDatetime) {
        $this->insertDatetime = $insertDatetime;
    }


    public function getUserId() {
        return (int) $this->userId;
    }


    public function getInsertDatetime() {
        return preg_match('!(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})!', $this->insertDatetime) ? $this->insertDatetime : '0000-00-00 00:00:00';
    }

}


# Even een praktisch voorbeeld:
$user = new User();
$user->setUserId('ABC');
$user->setInsertDatetime('InsertDatetime');

echo $user->getUserId();             # Geeft 0 terug
echo $user->getInsertDatetime();     # Geeft 0000-00-00 00:00:00 terug

# Als je dit nu gewoon zou doen (dit werkt niet met bovenstaande class):

$user = new User();
$user->userId = 'ABC';
$user->insertDatetime = 'InsertDatetime';

echo $user->userId;                  # Geeft gewoon ABC terug
echo $user->insertDatetime;          # Geeft gewoon InsertDatetime terug

?>

Als je nu ook nog eens $user->userId & $user->insertDatetime doorgeeft aan de database zullen er al snel fouten volgen en dit kan dus niet met de getters als ze correct zijn afgesteld.

Wat je natuurlijk ook kunt doen is altijd echo (int) $user->userId aanroepen en bij $user->insertDatetime kijken of het wel een correct formaat heeft. Maar dat is in mijn ogen nutteloos en als er security issues zijn moet je gewoon de getter aanpassen en klaar. Anders zul je door de gehele applicatie mogen lopen te zoeken achter $user->userId & $user->insertDatetime.

Waarschijnlijk zul je hier wel wat performance lost hebben, maar ik denk als je de view en alles samen neemt het niet echt een verschil zal maken op de totale performance omdat je anders ook $user->userId moet controleren.

Update
- Praktisch voorbeeld
- Waarom getters en setters gebruiken
Gewijzigd op 01/04/2013 12:32:09 door MayDay PHP
 
Willem vp

Willem vp

01/04/2013 12:32:49
Quote Anchor link
@MayDay:

Afgezien van je getInsertDatetime() zie ik in jouw aanpak geen verschil met public properties. En die method getUserId vind ik zelfs levensgevaarlijk. Als je namelijk een setUserId("blablabla") doet, geeft getUserId een 0 terug. Op Unix-systemen is dat het userid van root. Waarschijnlijk niet wat je wilt. ;-)

Als je bij setUserId() een controle op het te setten id zou inbouwen, heeft het wél toegevoegde waarde. En volgens mij is dat ook precies waar een setter voor is bedoeld. In getUserId() hoef je het id dan ook niet meer te typecasten naar een integer, omdat je al zeker weet dat het een integer is.

Eigenlijk geldt hetzelfde voor get/setInsertDatetime. De check op validiteit zou ik in de setter zetten, zodat je altijd (syntactisch) correcte data in je properties hebt zitten.

In wat voor gevallen zou dat niet werken bij protected properties?
 
MayDay PHP

MayDay PHP

01/04/2013 12:37:46
Quote Anchor link
@Willem vp
Normaal sla je een gebruiker op in een database en dat geeft toch geen problemen als je (int) $user->userId doet of sla ik hier de bal mis?

Tevens is userId een PRIMARY KEY met een AUTO_INCREMENT en zal deze niet eens een INSERT met userId 0 toestaan. Dus geen enkel probleem als je het mij vraagt. Zelfs geen INSERT met überhaupt een userId gedefinieërd. En bij UPDATE zie ik dit ook niet als een probleem omdat de user niet eens terug zal gevonden worden.

Als je protected properties hebt en iemand doet gewoon $this->userId = 'ABC' heb je terug hetzelfde probleem. Maar je zou inderdaad de fouten kunnen controleren bij de setters. Dat is ook de reden dat ik nu op dit moment in mijn applicatie geen enkele public of protected variabele heb staan!

In dit geval denk ik zelfs dat je performance gain zou kunnen hebben, alleen kan ik dit niet aantonen met een benchmark.

Tevens was mijn voorbeeld misschien niet goed genoeg. Maar ik heb genoeg classess in mijn applicatie waar private properties van levensgroot belang zijn.

Denk maar eens aan een tekst die gevalideerd moet worden op xss... of een hash genereren kan je ook gemakkelijker bij getters en setters. Anders moet je door de hele applicatie echo hash_hmac('algo', 'data', 'key'); doen en als je dan ook maar één iets zoals de key wilt veranderen mag je opnieuw gaan zoeken.
Gewijzigd op 01/04/2013 12:50:27 door MayDay PHP
 
Erwin H

Erwin H

01/04/2013 12:41:56
Quote Anchor link
Willem vp op 01/04/2013 12:32:49:
Afgezien van je getInsertDatetime() zie ik in jouw aanpak geen verschil met public properties.

Er is een levensgroot verschil met public properties.

Bij public properties kan jan en alleman erbij. Wil jij later je class aanpassen en de variabele weghalen (maar niet de getter/setter) dan heb je direct een probleem omdat je daarmee inconsistenties in je code kan gaan introduceren. Omdat je geen idee hebt waar in de rest van al je gebouwde applicaties dat property direct wordt aangeroepen kan je al je code gaan filteren om te weten te komen wat je moet aanpassen. Heb je alles op private staan en alleen de getters en setters public, dan is het geen enkel probleem.

Zelfde geldt voor protected properties (hoewel het potentiele probleem kleiner is).

Bij public en protected properties gaan externe factoren bepalen wat je in je class nog kan aanpassen, dat is geen goede eigenschap...
 
Willem vp

Willem vp

01/04/2013 12:58:44
Quote Anchor link
Quote:
Tevens is userId een PRIMARY KEY met een AUTO_INCREMENT en zal deze niet eens een INSERT met userId 0 toestaan.

Fout. Als je een auto_increment-veld insert met een waarde 0 of NULL, dan zal (in ieder geval MySQL) een record inserten met een nieuw gegenereerd id.

Quote:
Als je protected properties heb en iemand doet gewoon $this->userId = 'ABC' heb je terug hetzelfde probleem.

Nee, dan krijg je de foutmelding "PHP Fatal error: Cannot access protected property User::$userId" ;-)
 
MayDay PHP

MayDay PHP

01/04/2013 13:06:09
Quote Anchor link
Ohh. Dat wist ik niet. Maar bij een INSERT zet ik geen userId, dus alsnog geen probleem. En het tweede voorbeeld was als je dat in een andere class aanroept.

Tevens kun je niet altijd op input valideren omdat je bijvoorbeeld als een gebruiker een account aanmaakt nog altijd alles moet controleren.

Ik heb snel eens geprobeerd om een gebruiker toe te voegen in een tabel met AUTO_INCREMENT en dit werkt dus niet. De tabel accepteert wel de query, maar daar stopt het dus ook. Maar alsdanog bij een INSERT in een tabel met AUTO_INCREMENT moet je geen userId definiëren.
Gewijzigd op 01/04/2013 13:09:55 door MayDay PHP
 
Ozzie PHP

Ozzie PHP

01/04/2013 14:06:38
Quote Anchor link
Bedankt voor jullie reacties.

Erwin H op 01/04/2013 10:09:59:
Ozzie, volgens mij ben je nu echt op het punt gekomen dat je je moet gaan afvragen of OOP wel geschikt is voor jouw applicatie. Jouw obsesieve drang naar performance verbetering leidt je nu zelfs naar het in twijfel trekken van een belangrijk punt van een OOP applicatie. Misschien wel het belangrijkste voordeel van OOP.

OOP gebruik je doorgaans niet omdat je de snelst mogelijke applicatie wilt hebben, maar gebruik je omdat het grote voordelen biedt in development.

Erwin, als je goed kijkt, dan zie je dat dit een topic is van een halve maand geleden. Iemand hier op het forum trok het gebruik van private getters en setters in twijfel, en stelde dat je vaak net zo goed public properties kan gebruiken. Dit zette mij aan het denken met als resultaat dit topic. Ik wil OOP helemaal niet opgeven, maar ik wil wel de juiste wegen bewandelen. Uiteindelijk ben ik tot de conclusie gekomen dat ik niet met public properties wil werken. Wel schaf ik de setter functies af die vanuit de construct worden aangeroepen. Alle set functies die vanuit de constructor worden gedaan, zet ik voortaan in de constructor zelf, gescheiden door commentaar-regels. Ik heb dit gebenchmarkt en dit levert wel degelijk een snelheidsvoordeel op. Binnen de class spreek ik voortaan rechtstreeks de class properties aan (in plaats van een get method binnen de class zelf). Ook dit levert weer snelheidsvoordeel op. En properties die van buiten de class moeten worden benaderd krijgen een eigen getter. Mooi toch? :-)
Gewijzigd op 01/04/2013 14:08:43 door Ozzie PHP
 
Erwin H

Erwin H

01/04/2013 14:36:40
Quote Anchor link
Ozzie PHP op 01/04/2013 14:06:38:
Erwin, als je goed kijkt, dan zie je dat dit een topic is van een halve maand geleden.

Daar hoef ik niet goed voor te kijken, dat zag ik direct al. Ondanks dat heb ik toch de opmerking gemaakt omdat jij in dit topic nog niet verder had aangegeven welke kant je op was gegaan. En gezien al je andere vragen in vele topics blijf ik bij het punt. Wat je ermee doet moet je uiteraard helemaal zelf weten.


P.S. of je OOP wil opgeven is niet de vraag, of het niet beter is, is de vraag. Als je zo bezorgd bent over performance als jij, dan is OOP wellicht niet de goede basis om vanuit te gaan.
 
Ozzie PHP

Ozzie PHP

01/04/2013 14:48:16
Quote Anchor link
Ik vind OOP prima... maar ik wil binnen OOP wel de beste (en voor zover mogelijk snelste) oplossingen. Niks meer en niks minder. Vandaar dat ik soms kritische vragen stel. Stel dat we een doorsnee Mercedes en een Ferrari hebben. Laten we de Mercedes dan even vergelijken met OOP. Ik snap echt wel dat die Ferrari een stuk sneller gaat, maar ik wil dan wel dat binnen de mogelijkheden mijn Mercedes zo snel mogelijk gaat. Ik heb geen verstand van auto's, maar stel dat ik in de Mercedes de verkeerde bougies stop, of ergens een te smalle doorvoerkabel gebruik (ik verzin maar wat) dan gaat mijn Mercedes langzamer dan dat ie zou kunnen. En dat is nu juist waarom ik die vragen stel. Om er het maximaal haalbare uit te halen. En dat kan je alleen bereiken door kritische vragen te stellen en te hopen op nuttige antwoorden van overige forumleden. En die antwoorden krijg ik o.a. van jou waarvoor dank.
 
Wouter J

Wouter J

01/04/2013 14:53:01
Quote Anchor link
Maar vragen zoals dit kun je vergelijken met het vragen of het misschien goed is om een Ferrari bodywork op je Mercedes te zetten. Je verpest dan je Mercedes omdat je graag de snelheid van een Ferrari wilt.

(sidenote: Ik houd niet van Mercedes en Ferrari...)
Gewijzigd op 01/04/2013 14:53:37 door Wouter J
 
Ozzie PHP

Ozzie PHP

01/04/2013 14:58:04
Quote Anchor link
Nee nee. nogmaals... ik vraag niet om de snelheid van een Ferrari, maar ik vraag om de beste snelheid binnen de mogelijkheden van een Mercedes, rekeninghoudend met de "regels" van OOP. Laat ik het anders zeggen... ik wil geen dingen doen die de boel vertragen.

(Uiteraard zijn Mercedes en Ferrari slechts bedoeld ter illustratie.)
 
Wouter J

Wouter J

01/04/2013 15:01:45
Quote Anchor link
Maar wat jij hier wilt is 1 van de basis principes van OO buitenboord gooien om snelheid te krijgen.

Bijv. dit kan heel snel zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class User
{
    var
$name;
    var
$age;
}

class Database
{
    static function connect()
    {

        // ...
    }

    static function query()
    {

        // ...
    }
}


$user = new User;
$user->age = 52;
$user->name = 'Jaap';

Database::connect();
Database::query("INSERT INTO users (name, age) VALUES name = '{$user->name}' AND age = '{$user->age}'");
?>

Maar als je dat gebruikt dan ben je echt geen Mercedes meer...
 
Ozzie PHP

Ozzie PHP

01/04/2013 15:04:51
Quote Anchor link
Wouter, dat wil ik niet. Ik was aan het twijfelen gebracht, maar heb uiteindelijk besloten om het niet te doen. Lees ook deze reactie.
 
Wouter J

Wouter J

01/04/2013 15:08:37
Quote Anchor link
Nee, je hebt het uiteindelijk niet gedaan, maar alleen omdat er een paar goede mensen waren die je van de rand van de afgrond trokken en je op een veilige plek weer uit de dwangbuis haalden ;-)

Kritische vragen stellen is goed, maar het is beter om eerst na te denken of die vraag wel goed is. Of je niet tever doorgaat en eigenlijk alle principes overboord gooit.
Alsof je in een AJAX t-shirtje in de Feyenoord kern gaat zitten omdat dat AJAX t-shirtje nou eenmaal lekkerder zit. Alsof je vloekt in de kerk. Naja, je begrijpt het.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.