IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: require_once a class

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
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
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
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
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.