Zamilovat si programování Zamilovat si programování
Pouze tento týden až 80% sleva na SQL jazyky
Zamiluj si programování! Až 80 % bodů na prémiový obsah zdarma. Více informací

Diskuze: require_once a class

PHP PHP require_once a class American English version English version

Aktivity (1)
Avatar
Roman Duchoň:18.7.2018 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.7.2018 17:09
Odpovědět 18.7.2018 17:08
RD
Avatar
Odpovídá na Roman Duchoň
Martin Konečný (pavelco1998):18.7.2018 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.7.2018 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.7.2018 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.7.2018 17:33
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Roman Duchoň:18.7.2018 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.7.2018 21:21
RD
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:18.7.2018 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.7.2018 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.7.2018 21:49

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

Nahoru Odpovědět 18.7.2018 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.