Diskuze: require_once a class

PHP PHP require_once a class American English version English version

Aktivity (1)
Avatar
Roman Duchoň:18. července 17:08

Ahoj,
už se mi nějakou tu hodinu nedaří vymyslet, jak vložit proměnné do třídy.
Situace - mám jeden soubor config.php s uloženými parametry (nejen) pro databázi ($dbServer, $dbUser...).
Pak mám druhý soubor database.php, kde bych rád třídu s databází a různými funkcemi (např. samotné connect(), isThereOne($o­neFromForm, $oneFromSql)...).
A ve třetím souboru ty funkce volat.
No a nedaří se mi už úplný základ - nahnat do třídy Database v souboru database.php proměnné ze souboru config.php.
Konkrétně:

<?php
require_once 'config.php'; // Needed Configuration

class Database {
    public $dbServer;
    public $dbUser;
    public $dbPassword;
    public $dbDatabase;

aby ty proměnné uvnitř třídy obsahovaly hodnoty z config.php.

Zkusil jsem: Zkoušel jsem různé i různě hledal, ale nedaří se mi.
Např.:

  • _constructor - nechci, abych pak v třetím soubor pracoval s proměnnými, ale jel jen database = new Database().
  • get, set funkce
  • Nastavování proměnných public, global...
  • return v config.php (i s funkcemi)

...a tak dál

Chci docílit: Prosím o rady, jak celou tu myšlenku uvést do chodu, popř. jak config soubory s třídou řešíte vy.
Díky.

Editováno 18. července 17:09
Odpovědět 18. července 17:08
RD
Avatar
Odpovídá na Roman Duchoň
Martin Konečný (pavelco1998):18. července 17:27

Ahoj, nevím, jak složitý děláš systém, jestli máš něco, co ti dokáže tu instanci zprostředkovat (nějaké DI), jestli potřebuješ lazy-load atd. Pokud pracuješ jen na něčem jednoduchém, tak bych se nebál k databázi připojovat v každém požadavku (stejně to asi bude vyžadovat), takže bych měl zaváděcí soubor, např. index.php, ve kterém budeš mít

<?php

require_once "config.php";  // vloží proměnnou $config s údaji
require_once "Database.php";  // třída Database

$db = new Database($config["database"]["server"], $config["database"]["user"], ...);

a pak kdekoliv v aplikaci můžeš proměnnou $db použít a nemusíš pokaždé tvořit nové instance.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 18. července 17:27
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Roman Duchoň
Martin Konečný (pavelco1998):18. července 17:33

Využiješ tedy klasicky konstruktor třídy, který je k tomu přímo určený.

Rozhodně se vyhni postupům, kdy by si ty závislosti třída obstarala nějak sama. Tzn. rozhodně NE tyto případy:

// třída to bude mít natvrdo ve svém kódu
class Database
{

        private $dbServer = "localhost";
        private $user = "root";
        private $password = "123456";

}

// třída si to sebere z globálního prostoru
class Database
{

        public function __construct()
        {
                $this->dbServer = $GLOBALS["config"]["database"]["server"];
                $this->user = $GLOBALS["config"]["database"]["server"];

                // stejný případ i kdybys udělal
                global $config;

                $this->dbServer = $config["database"]["server"];
                $this->user = $config[["database"]["server"];
        }

}

// třída bude obsahovat jakési include, aby si to natahala sama
class Database
{

        public function __construct()
        {
                $config = require_once "config.php";

                $this->dbServer = $config["database"]["server"];
                $this->user = $config[["database"]["server"];
        }

}
Nahoru Odpovědět  +2 18. července 17:33
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Roman Duchoň:18. července 21:21

Úžasný, skvělý! :)
Ještě na to třeba zítra mrknu a zapřemýšlím (pro mě zas něco nového), doplním do zbytku kódu, celé upravím (takže raději bohužel více nekomentuji) ale zabralo to!

Nahoru Odpovědět 18. července 21:21
RD
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:18. července 21:31

U konfigů bych se nebál ani statiky, tak jak je to například v místním redakčním systému.

class Config {
    public static $db_host = 'localhost';
    public static $db_user = 'root';
}
Nahoru Odpovědět 18. července 21:31
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Daniel Vítek
Petr Čech:18. července 21:49

Jak potom řešíš lokální nastavení?

Nahoru Odpovědět 18. července 21:49
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.