[PHP] null of ''

Pagina: 1
Acties:
  • 287 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Hallo,
Ik was weer even bezig met PHP (met mijn db class enzo). Maar toen begon ik te denken aan null en '' zegmaar.
Omdat dit een beetje onduidelijk is, hier een voorbeeld van wat ik heb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
public function delete($table, $where=null)
{
    $query = "DELETE FROM ".$table;
    
    if( !is_null($where) )
    {
        $query .= " WHERE ".$where;
    }
    
    return mysql_query($query);
}


Zoals je ziet werk ik met $where=null, en is_null()
Maar wat is nou eigenlijk beter/sneller?

Werken met $where='' en empty()
of
$where=null en is_null() ?

Alvast bedankt :)

[ Voor 11% gewijzigd door Saven op 06-05-2007 19:38 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Sneller? Dat maakt maar marginaal verschil (zeker in vergelijking met de query die je erna uit gaat voeren. Wat me hier belangrijker lijkt is robuustheid. Wanneer iemand een lege string doorgeeft gaat het fout, maar ook wanneer iemand een paar spaties doorgeeft. Natuurlijk moet je niet een syntaxchecker gaan nabouwen, maar ikzelf zou minimaal controleren op null en vervolgens kijken of de getrimde string ongelijk is aan ''.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Janoz schreef op zondag 06 mei 2007 @ 20:30:
Sneller? Dat maakt maar marginaal verschil (zeker in vergelijking met de query die je erna uit gaat voeren. Wat me hier belangrijker lijkt is robuustheid. Wanneer iemand een lege string doorgeeft gaat het fout, maar ook wanneer iemand een paar spaties doorgeeft. Natuurlijk moet je niet een syntaxchecker gaan nabouwen, maar ikzelf zou minimaal controleren op null en vervolgens kijken of de getrimde string ongelijk is aan ''.
Dus jij stelt voor dat ik dit zou doen:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
public function delete($table, $where=null)
{
    $query = "DELETE FROM ".$table;
    
    if( $where != '' )
    {
        $query .= " WHERE ".$where;
    }
    
    return mysql_query($query);
}
?>

Of bedoel je dat niet?

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Waarom geen false?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
public function delete($table, $where=false) 
{ 
    $query = "DELETE FROM ".$table; 
     
    if( $where !== false ) 
    { 
        $query .= " WHERE ".$where; 
    } 
     
    return mysql_query($query); 
} 
?>

[ Voor 3% gewijzigd door LauPro op 06-05-2007 20:54 ]

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
LauPro schreef op zondag 06 mei 2007 @ 20:53:
Waarom geen false?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
public function delete($table, $where=false) 
{ 
    $query = "DELETE FROM ".$table; 
     
    if( $where !== false ) 
    { 
        $query .= " WHERE ".$where; 
    } 
     
    return mysql_query($query); 
} 
?>
Omdat je hem dan alsnog een "waarde" geeft terwijl dat niet hoeft :P

Acties:
  • 0 Henk 'm!

  • 2playgames
  • Registratie: Februari 2005
  • Laatst online: 01-06 15:19
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
public function delete($table = '', $where = '') {

    if (trim($table) == '') return false; // geen tabel gegeven

    $query = 'DELETE FROM ' . $table;
    
    if (trim($where) != '')
        $query .= ' WHERE ' . $where;
    
    return mysql_query($query);
}
?>

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Saven schreef op zondag 06 mei 2007 @ 21:17:
Omdat je hem dan alsnog een "waarde" geeft terwijl dat niet hoeft :P
Mja, dat gaat toch geen performanceprobleem opleveren? Je zit ook hier met een databaselaag, die parameters die je aan die WHERE kan toevoegen, zitten daar ook indices op?

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Nu online
LauPro schreef op zondag 06 mei 2007 @ 20:53:
Waarom geen false?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
public function delete($table, $where=false) 
{ 
    $query = "DELETE FROM ".$table; 
     
    if( $where !== false ) 
    { 
        $query .= " WHERE ".$where; 
    } 
     
    return mysql_query($query); 
} 
?>
Ik vind het nogal vies om in een variabele waarvan je verwacht dat het een string is opeens een boolean te stoppen.

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

robbert schreef op maandag 07 mei 2007 @ 00:22:
[...]
Ik vind het nogal vies om in een variabele waarvan je verwacht dat het een string is opeens een boolean te stoppen.
Agreed, maar PHP is min of meer typeless, dus je hoeft daar helemaal niet vanuit te gaan. Als je wel typed variabelen wil dan moet je op zoek naar een andere taal die dat wel heeft. Daarnaast kan je met false wel degelijk onderscheid maken of er nu een string in zit of niet. Je zou dan eigenlijk nog moeten checken met is_string() ofzo.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Nu online
LauPro schreef op maandag 07 mei 2007 @ 00:30:
[...]
Agreed, maar PHP is min of meer typeless, dus je hoeft daar helemaal niet vanuit te gaan. Als je wel typed variabelen wil dan moet je op zoek naar een andere taal die dat wel heeft.
In php mag het inderdaad. Wil niet zeggen dat je dit perse moet gebruiken. Zelf heb ik de gewoonte om dit soort dingen niet te doen.

Net zoiets dat je in Java (wat een keurige OO taal is), enkel classes kan maken met enkel public velden en static methoden. De taal staat dit toe, maar moet je het daarom doen?
Daarnaast kan je met false wel degelijk onderscheid maken of er nu een string in zit of niet. Je zou dan eigenlijk nog moeten checken met [em]is_string()[/em] ofzo.
Maar wat heeft dat uiteindelijk voor een voordeel met null?

[ Voor 11% gewijzigd door robbert op 07-05-2007 00:36 ]


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

robbert schreef op maandag 07 mei 2007 @ 00:33:
In php mag het inderdaad. Wil niet zeggen dat je dit perse moet gebruiken. Zelf heb ik de gewoonte om dit soort dingen niet te doen.

Net zoiets dat je in Java (wat een keurige OO taal is), enkel classes kan maken met enkel public velden en static methoden. De taal staat dit toe, maar moet je het daarom doen?
Je hebt het hier wel over een filosofie en een architectuur. Ik kan me best een applicatie bedenken die alleen maar classes nodig heeft met public velden en static methoden. Daarintegen kan ik me niet bedenken dat je binnen de PHP-scene een soort van subcultuur gaat ontwikkelen die pretendeert dat PHP opeens typed is, want dat is het gewoon niet. Nouja, intern wordt er misschien een kleine administratie bijgehouden, maar daarmee houdt het op.
Maar wat heeft dat uiteindelijk voor een voordeel met null?
In mijn ogen is false gelijk aan "niet gebruiken". Dus als die variable false is, dan is hij niet van toepassing binnen de functie. Null zou je kunnen gebruiken maar dat vind ik niet zo duidelijk, als iets null is kan het best zijn dat je die wilt gebruiken in een query (namelijk de MySQL-versie van null).

In mijn ogen is het feit dat je een boolean en een string door elkaar kan gebruiken in PHP juist een feature dan een 'bug'. Of het helemaal netjes is is een ander verhaal.

[ Voor 6% gewijzigd door LauPro op 07-05-2007 00:43 ]

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Nu online
LauPro schreef op maandag 07 mei 2007 @ 00:42:
[...]
Je hebt het hier wel over een filosofie en een architectuur. Ik kan me best een applicatie bedenken die alleen maar classes nodig heeft met public velden en static methoden.
De Math klasse bijvoorbeeld, maar verder kan ik me weinig nuttige voorbeelden bedenken.
Daarintegen kan ik me niet bedenken dat je binnen de PHP-scene een soort van subcultuur gaat ontwikkelen die pretendeert dat PHP opeens typed is, want dat is het gewoon niet. Nouja, intern wordt er misschien een kleine administratie bijgehouden, maar daarmee houdt het op.
Ik denk zeker niet dat php typed is, maar probeer eigenlijk wel te programmeren alsof het een typed taal is. Sinds php 5.1 is er overigens wel Type hinting. Dit werkt (tot mijn weten) helaas niet voor de primitieve types (dus int, char, string, float, bool), enkel voor classes en arrays.
In mijn ogen is false gelijk aan "niet gebruiken". Dus als die variable false is, dan is hij niet van toepassing binnen de functie. Null zou je kunnen gebruiken maar dat vind ik niet zo duidelijk, als iets null is kan het best zijn dat je die wilt gebruiken in een query (namelijk de MySQL-versie van null).
Daar heb je een punt.
In mijn ogen is het feit dat je een boolean en een string door elkaar kan gebruiken in PHP juist een feature dan een 'bug'.
Een bug is het sowieso niet.
Of het helemaal netjes is is een ander verhaal.
Is dat niet waar dit topic over gaat? De performance tussen al deze alternatieven hoef je je niet druk om te maken, de tijd die je bezig bent met de query uit te voeren is zoveel langer dat dat het probleem niet is.



Net even zitten prutsen met type hinting en primitieve types:
PHP:
1
2
3
4
5
6
<?
function blaat(integer $blaat) {
    return "test";
}
echo blaat(50);
?>

Nutteloos script, maar goed. De uitvoer:
Catchable fatal error: Argument 1 passed to blaat() must be an instance of integer, integer given, called in blaat on line 5 and defined in blaat on line 2

[ Voor 16% gewijzigd door robbert op 07-05-2007 01:02 ]


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

robbert schreef op maandag 07 mei 2007 @ 00:52:
Ik denk zeker niet dat php typed is, maar probeer eigenlijk wel te programmeren alsof het een typed taal is. Sinds php 5.1 is er overigens wel Type hinting. Dit werkt alleen (tot mijn weten) niet voor de primitieve types (dus int, char, string, float, bool), enkel voor classes en arrays.
Klopt, maar dat schiet inderdaad dus niet op, jammer dat ze niet even hebben doorgezet op dat punt, het is dat ik met zoveel legacy zit maar anders had ik bij 5.0 echt al overgeschakeld naar Java wat dat betreft.
Daar heb je een punt.
Overigens ben ik wel van mening dat dit redelijk PHP-eigen is. Veel PHP applicaties hebben geen eigen DBA layer waardoor er vrij hoog in de code al queries boven komen drijven. Dit kan je als een voordeel zien dat je alle 'overhead' niet hebt, maar zorgt er tegelijkertijd voor dat je met een partij work-a-rounds als deze zit.
Een bug is het sowieso niet.
Daar denken sommige PHP-developers anders over anders hor ;)
Is dat niet waar dit topic over gaat?
Lijkt me dat je in alle architectuurbeslissingen (wat dit topic een klein onderdeel van is) de afweging maakt of je conform de PHP (of PEAR) standaard werk of een eigen methode gebruikt. Dus 'netjes' volgens de richtlijnen of niet.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

Verwijderd

Ik vind het smerig om 'is_string' aan te roepen omdat je stiekem toch opzoek bent naar een sterk type. Dus feitelijk wil je wel een sterk type maar je behandeld het niet zo. Dus ik heb in ieder geval wel degelijk een voorkeur, en dat is dus 'null' boven 'false'.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

nee, ik bedoel:
controleren op null en vervolgens kijken of de getrimde string ongelijk is aan ''

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Ja ik vind het ook erg jammer dat PHP niet strong-typed is maar ja, ik moet er in Java op letten dat ik gewoon netjes mijn types gebruik en dat moet ik in PHP ook. Alleen krijg ik in Java altijd een error als ik dat niet doe en in PHP soms niet.

iOS developer


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Ow zo, mja ik neem niet aan dat je als where nog eens '' als parameter in gaat vullen. Dan kun je net zo goed alles gaan controleren, terwijl php dat netjes zelf kan :P
Pagina: 1