login  Naam:   Wachtwoord: 
Registreer je!
 Forum

eerste classe

Offline pj_muller00 - 06/12/2006 12:19
Avatar van pj_muller00PHP interesse Beste,
Ik heb de stap gezet.
Ik heb zonet mijn eerste klasse geschreven,
nu zou ik graag weten wat er beter aan kan (niet zozeer functionaliteit, maar het OOP programeren)

Hier volgt ze :
  1. <?php
  2. // Language Part
  3. define(_errorocured,"De actie kon niet tot een succesvol einde gebracht woden vanwege de volgende reden(en)");
  4. define(_toshort,"is te kort");
  5. define(_tolong,"is te lang");
  6. define(_min,", deze moet minimaal");
  7. define(_max,", deze kan maar");
  8. define(_char,"karakters bevatten.");
  9. define(_numeric,"moet numeriek zijn");
  10. define(_notemail,"is geen geldig email adres");
  11. define(_founddb,"werd alreeds gebruikt, probeer een andere.");
  12. define(_entertwicesame,"Je moet 2 maal dezelfde waarde ingeven voor");
  13. define(_char,"karakters bevatten.");
  14. define(_wait,"Je moet nog");
  15. define(_beforenextaction,"alvorens je deze actie kan herhalen (flood protectie).");
  16.  
  17. //Class part
  18.  
  19. class error_handler{
  20.  
  21. var $error_array = array();
  22.  
  23.  
  24. function add_error($error){//Add error to array, will be used in check_error, but can also be used 'manually'
  25. $this->error_array[] = $error;
  26. }
  27.  
  28. function check_error($value,$field_name,$minlength=0,$maxlength=0,$type=0,$extra_data=0){
  29. if($minlength && $minlength > strlen($value)){//If minlength is set, check if value is not to short
  30. $this->add_error($field_name." "._toshort._min." ".$minlength." "._char);
  31. }
  32. elseif($maxlength && $maxlength < strlen($value)){//If maxlengt is set, check if value is not to long
  33. $this->add_error($field_name." "._tolong._max." ".$maxlength." "._char);
  34. }
  35.  
  36. if($type){
  37. if($type == 'numeric' && !is_numeric($value)){//Check if value = numeric
  38. $this->add_error($field_name." "._notnumeric);
  39. }
  40. elseif($type == 'email' && (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$value) || strlen($value) == 0)){//Check if it is a valid email
  41. $this->add_error($field_name." "._notemail);
  42. }
  43. elseif($type == 'unique' && $extra_data){//Test if a value is unique (could be for a username)
  44. $query = query("SELECT * FROM ".$extra_data['table']." WHERE UPPER(".$extra_data['field'].") = UPPER('".$value."')");//Use your own query function here
  45.  
  46. if(num_rows($query)){//Same for num_rows
  47. $this->add_error($field_name." "._founddb);
  48. }
  49.  
  50. }
  51. elseif($type == 'same' && $extra_data){//Check if two values are the same (email, password check)
  52. if($value != $extra_data['value2']){
  53. $this->add_error(_entertwicesame." ".$field_name);
  54. }
  55. }
  56. }
  57. }
  58.  
  59. function flood_protection($sec){
  60. if(isset($_SESSION['wait']) && $_SESSION['wait'] > time()){
  61. $this->add_error(_wait." ".($_SESSION['wait']-time())." "._beforenextaction);
  62. }
  63. elseif(!$this->check_errors()){//If they were no errors, so proces completed, add the session
  64. $_SESSION['wait'] = $sec + time();
  65. }
  66. }
  67.  
  68. function check_errors(){//Check if the array contains any errors
  69. if($this->error_array){
  70. return true;
  71. }
  72. else{
  73. return false;
  74. }
  75. }
  76.  
  77. function report_errors(){//Show report errors
  78. $i=1;
  79.  
  80. if($this->check_errors()){//If array contains errors
  81. $output = _errorocured."<br>\n";
  82. foreach ($this->error_array as $value){
  83. $output .= $i++.". ".$value."<br>\n";
  84. }
  85. }
  86.  
  87. return $output;//Return str.
  88. }
  89. }
  90.  
  91. //Exemple
  92. if(isset($_POST['submit'])){
  93. $error = new error_handler;
  94. $error->check_error($_POST['username'],_username,4,20,'unique',array('table'=>'members','field'=>'username'));
  95. $error->check_error($_POST['password'],_password,6,20,'same',array('value2'=>$_POST['password_repeat']));
  96. $error->check_error($_POST['email'],_email,0,100,'email');
  97. $error->flood_protection(60);
  98.  
  99. if($error->check_errors()){
  100. echo $error->report_errors();
  101. }
  102. else{
  103. $query = "...";
  104. }
  105. }
  106. else{
  107. //form
  108. }
  109. ?>


Moest je ze zo goed vinden dat je ze wilt gebruiken, no problem 
Post ze wel niet op een fora zijnde jouw script. Niet echt fair 

Pj 

15 antwoorden

Gesponsorde links
Offline Thomas - 06/12/2006 12:49
Avatar van Thomas Moderator Ik zou geen constanten (buiten je class) definieren voor foutmeldingen.

Voor het toevoegen van errors hoef je niet per se een aparte methode te gebruiken. Je kunt ook zoiets doen: $this->error_array[] = "Je error";

In plaats van een if, elseif, ..., else statement in check_error() zou je ook een switch-statement kunnen gebruiken.

flood_protection hoort niet echt in een class die form-inhoud controleert (separation of concerns). Moet iemand ook een minuut wachten om een fout te herstellen bji wijze van straf? 

check_errors zou je kunnen vereenvoudigen tot:
return sizeof($this->error_array)
niet leeg => fouten.
Offline Stijn - 06/12/2006 12:53
Avatar van Stijn PHP expert 1e punt: defines in hoofdletters
2e punt: ik zou die flood_protection bovenaan zetten en dan je errors controleren
2.1: gebruik altijd een hoofdletter voor een classs.
3e punt: ik zou een constructor toevoegen en die wat uigebreid maken:

  1. <?
  2. class Error_handler
  3. {
  4.  
  5. function Error_handler( $values , $fields ) //je kan er nog extra inzetten , maar dit is enkel een voorbeeld
  6. {
  7.  
  8. if( is_array( $values ) === true && is_array( $fields) === true && count( $values ) == count( $fields ) ) {
  9.  
  10. foreach( $values as $key => $value ) {
  11. $this->check_error( $value , $fields[$key] );
  12. }
  13.  
  14. } else { //geen array
  15. $this->check_error( $value , $fields[$key] );
  16. }
  17.  
  18. }
  19.  
  20. }
  21. ?>


dat zijn zo de opmerkelijkste punten die ik vind
stijn
Offline pj_muller00 - 06/12/2006 12:59 (laatste wijziging 06/12/2006 13:38)
Avatar van pj_muller00 PHP interesse
Citaat:
Ik zou geen constanten (buiten je class) definieren voor foutmeldingen.

Binnen dus ?
Citaat:
Voor het toevoegen van errors hoef je niet per se een aparte methode te gebruiken. Je kunt ook zoiets doen: $this->error_array[] = "Je error";

Ik heb daar een extra functie voor gemaakt om handmatige errors toe tevoegen.

dus $error->add_error('handmatige error 1'), stond ook in commentaar

Citaat:
Moet iemand ook een minuut wachten om een fout te herstellen bji wijze van straf?

Totaal niet  Zou wel grappig zijn ,
Flood protection wordt als laatste opgeroepen, en als er geen fouten gevonden zijn, dus actie voltooid, maakt hij de sessie aan.
Van zodra er een fout is gevonden mag ie het direct opnieuw proberen (stond ook in opmerkingen  ).

@ stijn

Citaat:
2e punt: ik zou die flood_protection bovenaan zetten en dan je errors controleren

Ik geloof dat je bedoelt om het eerst aan te roepen ...
Maar dan kan je niet zien of er al errors zijn gemaakt of niet.
Dan kom je in een situatie terecht waar als iemand een fout mag, het een minuut later maar opnieuw mag proberen, niet echt de bedoeling 



Nog opmerkingen ?
Heb ik $this-> enz. goed gebruikt ?
Hoeft alleen als je het als een soort 'sessie' wilt gebruiken hé ? Dat de waarde onthouden blijft ..

Pj  
Offline Stijn - 06/12/2006 14:00
Avatar van Stijn PHP expert je gebruik is goed. Je gebruikt $this-> om functies/variablen aan de roepen binnen de class zelf en in zijn subclassen (zie extend)
Offline pj_muller00 - 06/12/2006 14:53
Avatar van pj_muller00 PHP interesse maar ook als soort sessie, ik set $this->error_array om dat de error_array bij de volgende keer dat ik ze aanroep nog zou bestaan.

Zou het een goed idee zijn om dit hier als script toe te voegen ?
Offline marten - 06/12/2006 15:10
Avatar van marten Beheerder Documentatie binnen het script kan veel beter. Ook moet je aangeven of je php4 of php5 gebruikt. Wanneer je php5 gebruikt in deze class staan er nog wat foutjes in zoals bijvoorbeeld:

  1. <?php
  2. var $error_array = array();
  3. ?>


dat je veranderen moet/kan naar:


  1. <?php
  2. public/private $error_array = array();
  3. ?>
Offline pj_muller00 - 06/12/2006 15:15
Avatar van pj_muller00 PHP interesse Waar kan ik de 'nuance' verschillen vinden tussen PHP4 en 5 ?

Pj
Offline ikkedikke - 06/12/2006 15:18
Avatar van ikkedikke PHP expert Als je er toch nu pas mee begint kan je eigenlijk net zo goed de nieuwe dingen van PHP5 gelijk leren.
Offline nemesiskoen - 06/12/2006 15:29
Avatar van nemesiskoen Gouden medaille

PHP expert
Het grootste verschil tussen php4 en php5 op vlak van OO is encapsulatie (var is vervangen door public, protected en private, en deze kan je ook voor methodes gebruiken) en de constructor. Verder zijn er een hoop andere dingen aangepast betreffende magic methodes en nog wat andere zaken, maar encapsulatie en de constructor zijn de voornaamste.
Offline Rik - 06/12/2006 17:07
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Op PHP.net staat het allemaal uitgelegd en voorgedaan.
Offline Stijn - 06/12/2006 17:28
Avatar van Stijn PHP expert
Citaat:
maar ook als soort sessie, ik set $this->error_array om dat de error_array bij de volgende keer dat ik ze aanroep nog zou bestaan.
is niet waar , je moet dan met de functies __sleep en __wakeup werken in je class om data van je class op te slaan. Hier pas ik ff de functies toe op jou class:
  1. <?php
  2. class Error_handler
  3. {
  4.  
  5. function __sleep()
  6. {
  7. //je returnt altijd een array met de var names die jij bewaard wilt
  8. return array("error_array");
  9. }
  10.  
  11. function __wakeup() {}
  12.  
  13. }
  14.  
  15. $obj = new Error_handler();
  16. $_SESSION['object_slaapt'] = serialize( $obj );
  17.  
  18. //op pagina 2
  19. $we_gaan_verder_met_onze_vorige_object = unserialize( $_SESSION['object_slaap'] );
  20. $we_gaan_verder_met_onze_vorige_object->check_error(...);
  21. ?>


ps: OO in PHP4 en PHP5 verschilt veel. maar als je iets wilt private maken in een PHP4 class zet je er een '_'-teken voor de naam
  1. <?
  2. var $_privateVar;
  3. ?>

PHP5 bied meer mogelijkheden dat is waar , maar PHP4 toont ook nog goeie dingen

stijn
Offline pj_muller00 - 06/12/2006 20:07
Avatar van pj_muller00 PHP interesse Nu volg ik je niet ...

Want zie, als ik $error[] = ... had gedaan, was ik dat bij de volgende 'aanroep' toch kwijt geweest.

Want functies, al die waarden worden 'gewist' van zodra ze ge-execute zijn. en met die this niet.

En dat verhaal van die sleep  
Offline Stijn - 06/12/2006 23:02
Avatar van Stijn PHP expert de sleep zorgt ervoor dat je data van je variablen kan bewaren. Bijvoorbeeld je controleert ze op pagina 1 en je wilt die errors nog op pagina 2 behouden dan is __sleep en __wakeup daarvoor gemaakt.

groeten
stijn
Offline pj_muller00 - 07/12/2006 10:31
Avatar van pj_muller00 PHP interesse ah ok ,

Zover moet het niet  

als het maar van lijn op lijn in één pagina onthouden wordt is het goed ,

En dat is die this hé ?    
Offline nemesiskoen - 07/12/2006 11:34 (laatste wijziging 07/12/2006 11:43)
Avatar van nemesiskoen Gouden medaille

PHP expert
Citaat:
OO in PHP4 en PHP5 verschilt veel. maar als je iets wilt private maken in een PHP4 class zet je er een '_'-teken voor de naam


nee!

Je kunt iets misschien virtueel private maken, door te zeggen tegen de end-user alles met _ voor kan je best niet aanroepen, maar echt private is het niet hoor. Je kan het ZONDER 1 probleem van buiten de klasse aanroepen.

Meer info over dat serializeren vind je hier: http://www.site...amp;id=439
kijk ook bij de comments, daar staan een hoop interessante reacties tussen.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.249s