Door
Michael R
op 04-04-2015 10:51
gewijzigd op 06-04-2015 13:13
4.853 views
Hallo,
Waarom kan dit niet?
<?php
include_once('databaseclass.php');
class user {
private $query = mysqli_query($database->connect(),"SELECT * FROM users WHERE login_hash = '".$_SESSION['user_hash']."' LIMIT 1");
private $query_array = mysqli_fetch_array($query);
}
?>
Ik krijg deze error:
Parse error: syntax error, unexpected '(', expecting ',' or ';' in C:\xampp\htdocs\php_forum\imports\classes\userclass.php on line 7
Class member variables are called "properties". You may also see them referred to using other terms such as "attributes" or "fields", but for the purposes of this reference we will use "properties". They are defined by using one of the keywords public, protected, or private, followed by a normal variable declaration. This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.
Hoe je dit wel kunt doen is zo:
<?php
include_once('databaseclass.php');
class user {
private $query;
private $query_array;
public function __construct()
{
$this->query = //... assign je value;
$this->query_array = //... assign je value;
}
Waar heb je de variabele $database geinitialiseerd ?
Volgens mij heb jedeze niet als databaseclass geinitialiseerd, dan kan je hem ook niet als zodanig gebruiken.
@moderator(s) wellicht is dit topic beter op zijn plaats in de categorie "Object-Oriented Programming"?
Als je van object A (van klasse A) gebruik wilt maken in object B (van klasse B), dan moet op een of andere manier object A bekend zijn bij object B. Je zou dit bijvoorbeeld kunnen bereiken door bij creatie een referentie van object A aan object B door te geven:
<?php
// *** declaratie ***
// NB: namen van classes zouden met een Hoofdletter moeten beginnen
class User
{
protected $db;
public function __construct($db) {
$this->db = $db;
}
// na creatie van een object van deze klasse kun je in je methoden
// gebruik maken van je database via $this->db
}
// *** aanroep ***
// creatie database object
$db = new Database(...);
// creatie user object
$user = new User($db);
?>
Is dit trouwens een goede manier om te verbinden met de database of kan het beter?
Dit kan (stukken) beter, want deze class heeft op dit moment geen toegevoegde waarde. De parameters waarmee je een verbinding maakt zijn hard gecodeerd, wat de klasse niet herbruikbaar maakt. Daarnaast wordt er geen character encoding geselecteerd bij het maken van de connectie wat een bron van veel ellende is. Ook bevat de klasse geen verdere (shorthand) methoden voor het uitvoeren van queries, het escapen van DATA binnen je SQL, het starten, committen en terugdraaien van transacties, het ophalen van resultaten (waar je een aparte klasse aan zou moeten wijden) of insert-id's en eventueel het bijhouden van statistieken (als je dat leuk vindt).
Het gebruik van klasses zou je (op den duur) werk uit handen moeten nemen en taken eenvoudiger moeten maken. De bovenstaande database-klasse doet dit niet.
Wat is "de oude manier"? Een variant waarbij je je code helemaal uitschrijft zonder gebruikmaking van klasses (oftewel "procedureel" in plaats van "object georienteerd")?
Daar is in principe niks op tegen als je dat in een los script doet ofzo, maar als je iets vaker (her)gebruikt dan schrijf je dat vast niet elke keer opnieuw uit neem ik aan, maar zet je het een en ander in functies of klasses. Op die manier heb je op den duur een collectie van bouwstenen waarmee je sneller kunt bouwen.
Een bijkomend voordeel daarvan (het gebruik maken van bouwstenen) is dat je dingen ook elke keer op precies dezelfde manier aanpakt. Als je je code elke keer helemaal opnieuw uitschrijft heb je die garantie niet. En als je dan toch elke keer alles knipt en plakt kun je er beter voor zorgen dat je dezelfde (en één) bron gebruikt niet?
En nog een voordeel is is dat je het maar 1x hoeft uit te denken en je kunt het daarna (zonder al teveel na te denken) gebruiken. Dan hoef je er ook maar 1x voor te zorgen dat je een aanroep van mysqli_set_charset() (of de OOP-variant daarvan) niet vergeet :).
Wat ik altijd doe is dat ik een connectie opzet in een bestand. Die stop ik in een variabele en die gebruik ik dan overal in al mijn codes om queries uit te voeren die ik overigens wel in functies heb staan.