Vinnaren i pepparkakshustävlingen!
2016-06-05, 13:21
  #1
Medlem
Jag är förvirrad när det gäller anslutningen mot databasen. Jag ska berätta men ta en titt på koden här nedan:
Kod:
<?php

// Connection.php
class Connection
{
    public function connect()
    {
        // try
        $pdo = new PDO("mysql:host=host;dbname=dbname,charset=utf8", "user", "pass");
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
        // catch
    }
}
Kod:
<?php

// User.php
include_once 'Connection.php';
class User
{
    private $db;

    public function __construct()
    {
        $this->db = new Connection();
        $this->db = $this->db->connect();
    }
}
Kod:
<?php

//login.php
include_once 'User.php';
$user = new User(); // Nu borde man vara ansluten mot databasen
När man vill ha två klasser som har samma __construct inkluderade i login filen och skapar instanser, blir det krångligt med anslutnignen?
__________________
Senast redigerad av zyxos 2016-06-05 kl. 13:35.
Citera
2016-06-05, 15:58
  #2
Medlem
För det första, håll inte på inkludera filer på massa olika ställen, det blir bara kaos. Inkludera allt på ett ställe eller lär dig använda http://php.net/manual/en/language.oop5.autoload.php

Jag skulle föreslå att du kör dependency injection, dvs att du ger en anslutning till dina objekt när du skapar dom istället för att skapa anslutningen i objektet.

Inte provat koden men typ såhär:

Kod:
<?php
// Connection.php

class Connection
{
    public 
$connection;

    public function 
connect()
    {
        
// try
        
$pdo = new PDO("mysql:host=host;dbname=dbname,charset=utf8""user""pass");
        
$pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        
$this->connection $pdo;
        
//return $pdo;
        // catch
    
}
}

Kod:
<?php
// User.php

class User
{
    private 
$db;

    public function 
__construct(Connection $connection//Kräv en anslutning för att skapa en User
    
{
        
$this->db $connection;
    }
}

Kod:
//Förutsatt att filerna heter samma namn som klassnamnet, kan göras säkrare också
function __autoload($class_name) {
        require 
$class_name '.php';
}

//Skapa anslutningen
$connection = new Connection();
$connection->connect();

$user = new User($connection); //Ge user tillgång till den anslutning du redan skapat
$user2 = new User($connection); //Ge user2 tillgång till samma anslutning som user
$randomSak = new Sak($connection); //osv 
Citera
2016-06-05, 21:25
  #3
Medlem
Tack, jag har kikat in på spl_autoload_register och vad jag har förstått så inkluderas en specifik klass php-fil automatiskt när man gör en ny instans. Ska autoload finnas med i varje filer?
__________________
Senast redigerad av zyxos 2016-06-05 kl. 21:29.
Citera
2016-06-06, 19:50
  #4
Medlem
Citat:
Ursprungligen postat av zyxos
Tack, jag har kikat in på spl_autoload_register och vad jag har förstått så inkluderas en specifik klass php-fil automatiskt när man gör en ny instans. Ska autoload finnas med i varje filer?
Beror ju hur din app är byggd, din autoload måste ju registreras någonstans. När man håller på med OO vill man ju helst att du har någon form av front controller/bootstrap där man sätter upp saker som autoload så man sen aldrig behöver inkludera filer.

https://www.binpress.com/tutorial/ph...ash-course/146 (inte ens kollat om det är vettigt men verkar beskriva principen)

Men det är väl kanske över din nivå, du kan ju skapa en include.php/config.php som innehåller din autoloader och så inkluderar du den i dom filer där det behövs, vilken inte är alla, den behöver bara registreras en gång någonstans.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback