Door
- Rob -
op 14-02-2017 17:38
gewijzigd op 14-02-2017 18:00
2.321 views
Hallo!
Ik was weer aan het experimenteren met OOP maar ik stuiterde op een vraag waar ik niet uit kwam en het niet precies op Google kon vinden..
class Database {
protected $_hostname = 'localhost';
protected $_username = 'root';
protected $_password = '';
protected $_database = 'rob';
public function connect() {
$connection = mysqli_connect($this->_hostname, $this->_username, $this->_password, $this->_database);
if(!$connection) {
printf('Error met verbinding');
exit();
}
}
}
class User extends Database {
public $test = 'test';
public function __construct() {
$database = new Database;
$database->connect()->real_escape_string($test);
}
}
$database = new Database();
$database->connect();
$user = new User;
Hoe kan ik in de User class de variable $connection aanroepen voor bv. real escape string toe te passen?
Of zou ik hier in de Database class functions voor moeten aan maken of dergelijk?
[size=xsmall]Toevoeging op 14/02/2017 17:59:08:[/size]
UPDATE CODE:
class Database {
protected $_hostname = 'localhost';
protected $_username = 'root';
protected $_password = '';
protected $_database = 'rob';
public $connection;
public function connect() {
$this->connection = mysqli_connect($this->_hostname, $this->_username, $this->_password, $this->_database);
if(!$this->connection) {
printf('Error met verbinding');
exit();
}
}
}
class User extends Database {
public $test = 'test';
public function __construct() {
$database = new Database;
$con = $database->connection;
$con->real_escape_string($test);
}
}
error bij de code is:
Fatal error: Uncaught Error: Call to a member function real_escape_string() on null in C:\xampp\htdocs\index.php:28 Stack trace: #0 C:\xampp\htdocs\index.php(35): User->__construct() #1 {main} thrown in C:\xampp\htdocs\index.php on line 28
2 punten:
1. Waarom extendt de User class de Database class? Wat denk je hiermee te bereiken?
2. Je zegt nergens $database->connect() dus zal $database->connection nooit gevuld zijn, zoals je foutmelding aangeeft.
1. Dit is gewoon even om te oefenen
2. Waar moet ik connect() dan aangeven? Als ik dat toevoeg, dus zo: $database->connect(); geef hij nog steeds de zelfde error?
Heeft iemand misschien een voorbeeld van hoe ik dit moet doen?
[size=xsmall]Toevoeging op 14/02/2017 18:45:19:[/size]
Laat het voorbeeld maar ;-)
Ik heb nog even goed ernaar gekeken en kwam hierop uit:
$database = new Database;
$database->connect();
$database->connection->real_escape_string($this->test);
Ik denk dat je inderdaad eens naar het data mapper pattern wilt kijken. Dan krijg je namelijk dit:
User <—> UserMapper <—> Database
Je moet véél abstracter leren denken als je de vergissing zoals class User extends Database begaat. De user is namelijk geen database. En de user vult de database ook niet aan. Klinkt raar, maar zo logisch is het wel.
In plaats daarvan krijg je:
• een user die een user is (en niet meer dan dat);
• een database om dingen in op te slaan en dingen uit te halen;
• een mapper die een user uit de database haalt of in de database opslaat.
Maar in de User class wil ik functions aan maken zoals givePromotion() moet dit dan ook via de mapper? Want ik had een paar oude bestanden een daar heette de Database class Object en werd het class User extends Object
Is dat dan wel goed gedaan? Of zit ik nu gewoon erg mis?
Het is niet logisch dat een gebruiker een database class extendt. Is een gebruiker een database? Nee.
Begin gewoon vanaf het begin, en ga niet zitten "oefenen" zonder dat je begrijpt wat je oefent. Er zijn boeken volgeschreven over OOP.
de class gebruiker is niet voor de gebruikers zelf, maar voor de functies voor de gebruikers en administrators voor de gebruikers zoals: Promoties geven, degraderen, etc.
<?php
class User /* Ik weet enkel en alleen maar waar een user uit bestaat en van de rest van de wereld weet ik niets */
{
private $name;
private $email;
/* dit noemen we ook wel een setter */
public function setName($name)
{
$this->name = $name;
}
/* dit noemen we ook wel een getter */
public function getName()
{
return $this->name;
}
/* hier nog een setter en getter voor $email */
public function setEmail($email)
{
$this->email = $email;
}
public function getEmail()
{
return $this->email;
}
}
?>
Hier een basis Mapper:
<?php
class Mapper
{
protected $db;
/* de constructor */
public function __construct($db)
{
$this->db = $db;
}
}
?>
Dan een UserMapper die de eigenschappen van de basis Mapper overerft. (Handig als je later ook andere mappers wilt toevoegen)
<?php
class UserMapper extends Mapper
{
public function __construct($db)
{
parent::__construct($db);
}
public function getUser($id)
{
$result = $this->db->query("SELECT * FROM users WHERE id=" . $id);
$user = new User();
$user->setName($row['name']);
$user->setEmail($row['email']);
return $user;
}
return null;
}
/* andere functies zoals getAllUsers(), createUser(), updateUser() en deleteUser() nog toe te voegen */
}
?>
test:
<?php
/* eigenlijk zou je ook een database class moeten hebben maar gemakshalve gebruiken we hier de standaard php mysqli class even */
$db = new mysqli("localhost", "db_user", "db_pass", "db_name");