Dat heb ik als tekst wat alleen getoond wordt als er niks ingevoerd is.
Bij het aanroepen wordt daaronder een loginclass aangeroepen die de fout aanmaakt.
[size=xsmall]Toevoeging op 30/03/2014 21:30:04:[/size]
class bestandje 1:
<?php
class Foutje{
public $probleempje;
public $probleem;
public function foutjeis($probleempje){
$this->probleem = $probleempje;
echo $this->probleem; //werkt dit laat de melding zien
}
public function geeffout(){
echo "hoi"; //laat hoi in het rood zien
echo $this->probleem; //werkt niet
}
}
?>
Verkleind login clasje 2
<?php
include_once "foutje.class.php"; //error fout probleem class
class Login{
public $error;
function __construct(){
$this->error = new Foutje();
$this->error->foutjeis("Foute gebruikersnaam of wachtwoord");
}
}
?>
Het PHP/HTML loginbestandje 3
<?php
session_start();
include_once "login.class.php"; //implementeerd het bestand login.class.php in deze pagina
include_once "foutje.class.php"; //fout probleempje class
if(!empty($_POST["submit"])){ //als er op Login gedrukt wordt voer dit uit
$foutje = new Foutje();
$login= new Login();
}
?>
<table width="325" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="bladiebla" method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr><td colspan="3"><font size="2"><i>Na deze site wordt er gebruik gemaakt van <a target="_blank" href="sessievspermanent.html">sessie cookies </a></i></font></td></tr>
<tr>
<td colspan="3"><strong>Login </strong> </td></tr>
<!-- waar het getoond dient te worden -->
<tr><td colspan="3"><font color="red"> <?php if (!empty($_POST["submit"])){ $foutje->geeffout(); } ?> </font> </td> </tr>
<tr>
<td width="78">Gebruikersnaam</td>
<td width="6">:</td>
<td width="294"><input name="loos" type="text" id="geenpaspoort"></td>
</tr>
<tr>
<td>Wachtwoord</td>
<td>:</td>
<td><input name="less" type="password" id="andersdanpaspoort"></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td><input type="submit" name="submit" value="Login"></td>
</tr>
<tr>
<td><a href="klik/klikker.php">Registreer</a></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
nu geeft je kennelijk wel teksten mee, maar in je oorspronkelijk vraag niet.
Vandaar mijn vraag "welke tekst" als in "welke tekst zou moeten verschijnen, aangezien je niets meegeeft".
En zoals ik het nu zie, doe je dat nog steeds niet.
in clasje2 vraag je de tekst niet op.
in loginbestandje3 set je geen tekst om te tonen. (ok, er zou nog Hoi moeten verschijnen?)
En verder:
ik zou de foutje-class niet zelf laten echo-en, maar een tekst (html) later retourneren.
Dan wordt het dus iets als
<?php echo $errorclass->geeffouttekst(); ?>
Voordeel is dan, dat je die tekst ook kunt mailen, loggen of iets anders leuks mee doen.
dit maakt een NIEUWE instantie van de class Foutje.
Ik kom dit een paar keer tegen in je snippets. Een aantal dingen vallen me op.
Als eerste zorg dat je goed gaat inspringen.
Dan je benamingen. Wat dacht je van:
<?php
class Error
{
private $error; // gebruik private voor je properties!
public function setError($error)
{
$this->error = $error;
return $this; // geef ons eigen object terug bij setters dat is makkelijk voor later
}
public function getError()
{
return $this->error; // nooit geen echo gebruiken in methods. in plaats daarvan gewoon de tekst teruggeven!
}
}
$error = new Error();
$error->setError('Wat een enorme fouten!');
@Ivo P sorry ik begrijp het niet helemaal, mijn loginscript is best uitgebreid en dit kleine stukje werkt niet.
@Frank Nietbelangrijk bedankt voor de reactie maar het werkt helaas niet.
Het was ook niet mijn bedoeling om het uiteindelijk te echoƫn en heb het alleen maar gedaan om de fout te zoeken.
Nu heb ik dit als Error class
error.class.php
<?php
class Error
{
private $error; // gebruik private voor je properties!
public function setError($error)
{
$this->error = $error;
return $this; // geef ons eigen object terug bij setters dat is makkelijk voor later
}
public function getError()
{
return $this->error; // nooit geen echo gebruiken in methods. in plaats daarvan gewoon de tekst teruggeven!
}
}
?>
login.class.php
<?php
include_once "error.class.php"; //error fout probleem class
class Login{
public $error;
function __construct(){
$this->error = new Error();
$this->error->setError("Foute gebruikersnaam of wachtwoord");
}
}
?>
login.php
<?php
session_start();
include_once "login.class.php"; //implementeerd het bestand login.class.php in deze pagina
include_once "error.class.php"; //fout probleempje class
if(!empty($_POST["submit"])){ //als er op Login gedrukt wordt voer dit uit
$foutje = new Error();
$login= new Login();
}
?>
<table width="325" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="bladiebla" method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr><td colspan="3"><font size="2"><i>Na deze site wordt er gebruik gemaakt van <a target="_blank" href="sessievspermanent.html">sessie cookies </a></i></font></td></tr>
<tr>
<td colspan="3"><strong>Login </strong> </td></tr>
<!-- waar het getoond dient te worden -->
<tr><td colspan="3"><font color="red"> <?php if (!empty($_POST["submit"])){ $foutje->getError(); } ?> </font> </td> </tr>
<tr>
<td width="78">Gebruikersnaam</td>
<td width="6">:</td>
<td width="294"><input name="loos" type="text" id="geenpaspoort"></td>
</tr>
<tr>
<td>Wachtwoord</td>
<td>:</td>
<td><input name="less" type="password" id="andersdanpaspoort"></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td><input type="submit" name="submit" value="Login"></td>
</tr>
<tr>
<td><a href="klik/klikker.php">Registreer</a></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
geef je property eens een standaard waarde:
<?php
class Error
{
private $error = '<you did not set the error>';
...
}
?>
krijg je dan wel wat te zien?
[size=xsmall]Toevoeging op 30/03/2014 23:57:19:[/size]
in je login class maak je een instantie van de Error class.
Maar in je login.php maak je weer een andere instantie van de Error class.
Regel 11 van login.php kan dus weg.
en op Regel 26 moet je dan dit doen:
$login->error->getError();
Hetgeen geen nette oplossing is in mijn ogen. Je hebt namelijk de $error property public gemaakt in plaats van private waardoor mijn bovenstaande code werkt. ik vind dat je ook deze property private zou moeten maken maar dan werkt $login->error->getError(); niet meer. Dat kun je weer oplossen door aan de Login class een method getError() toe te voegen die dan netjes de $error property teruggeeft. inplaats van:
$login->error->getError();
schrijf je dan:
$login->getError()->getError();
[size=xsmall]Toevoeging op 31/03/2014 00:10:34:[/size]
nog even te term instantie of instantiƫren verduidelijken:
Sorry dat ik het zeg, maar deze regel code vind ik een gedrocht. Dit moet je als programmeur niet uit je vingers willen krijgen. Ik vind dat nog erger dan een opmerking als "nooit geen echo gebruiken" (en dat vind ik al onacceptabel taalgebruik voor een programmeur; het betekent dat je niets hebt begrepen van booleaanse algebra).
Nu snap ik in dit geval uberhaupt het toegevoegde nut van een Error-class niet, maar als je die per se wilt gebruiken, maak dan een method $login->getError() en laat die vervolgens $this->error->getError() teruggeven.
als je eenmaal hebt besloten oo voor deze applicatie te gebruiken moet je ook alles in oo doen.
Op dit punt verschillen we duidelijk van mening. ;-)
Waarschijnlijk heb jij in je gereedschapskoffer geen schroevendraaiers, tangen, vijlen, inbussleutels en boren, maar alleen een hamer. Want als je eenmaal een hamer hebt gebruikt, moet je hem blijven gebruiken.
OO is niets meer of minder dan een stuk gereedschap. Voor bepaalde toepassingen kun je het prima gebruiken, voor andere toepassingen is het minder of zelfs ongeschikt. Software bestaat vaak uit meerdere componenten. Sommige van die componenten passen goed in een OO-jasje, en andere weer niet. Als je alleen maar OO't om te OO'en, ben je mijns inziens verkeerd bezig.