Autor Zpráva
snazimse
Profil
Zdravím,

zajímají mě vaše názory,jak se to má správně řešit,globální přístup k něčemu co potřebuji v jiném souboru.
Asi určitě rozdíly v OOP a procedurálním,budou značné.

Ale jak správně,to využívat.Příklady,chci přístup k poli jiného souboru cizího ,nebo přístup proměnná ve vzdáleném cizím souboru.
Co používat? Případně,pokud víte nějakém užitečném článku na toto téma budu vděčný.

Vytvořit si nějakou funkci na to? Kde uvedu global? Nebo require?

Superglobální proměnné o tom se asi už nemá cenu bavit.


Díky všem!
Tori
Profil
snazimse:
Takovým pěknějším pokračováním globálních proměnných je statický registr (viz starší frameworky, např. Zend 1.10) - oproti globálním proměnným tenhle návrhový vzor vyřešil hlavně zapouzdření, dalo se nastavit, aby jednotlivé proměnné byly zapisovatelné pouze jednou apod. Teď se používá dependency injection (wikipedie překládá jako „vkládání závislostí“), např. miniseriál na Zdrojáku a pokročilejší seriál od D.Grudla.
snazimse
Profil
Ok,super pročtu si.A ještě by mě zajímalo co se týká procedurálního programování,kde nemám,třídy,jak to tam řešit?

Díky moc!
Tori
Profil
snazimse:
Co znamená cizí soubor - na jiném serveru?
Dá se využít návratová hodnota include, nebo můžete mít ve funkci statickou cache. Nebo i ten statický registr by se dal udělat jako funkce. Asi by pomohly nějaké konkrétnější příklady, co přesně od jiného skriptu potřebujete - jestli to je jen jedna z mnoha proměnných v něm, výsledek výpočtu, databázové připojení nebo obecně něco, co na jednom místě někam uložím a na jiném zas načtu.
snazimse
Profil
No třeba proměnnou,ze souboru v jiné složce.No třeba,jednoduchý případ,vytvořím si.Dva php soubory a do každého vytvořím nějaké pole.
A uložím si to pole do proměnné.A pak ho chci vzdáleně,načíst.Předpokládám,že kdybych to měl ve funkci použiju require a načtu si ji.
Ale jak to udělat,když tam budu mít jen tu proměnnou v obou souborech bez funkce.Bez použití superglobálních.


Díky!
Tori
Profil
Tohle nefunguje?
// pole.php
<?php
$pole = [1, 2, 3];

// jinySkript.php
<?php
function foo() {
    require './pole.php';
    return $pole;
}

var_dump(foo());
Joker
Profil
snazimse:
Ta otázka je dost obecná. Tak obecně se dá říct, že by takové globální proměnné pokud možno neměly existovat.
Jak ukazuje i samotný dotaz, vznikají pak nejasné závislosti mezi jednotlivými soubory.

V OOP jsou ve vkládaných souborech víceméně jen třídy, které by měly být zapouzdřené, tzn. by žádné okolní proměnné vůbec neměly používat (veškerá komunikace s okolím by měla jít přes parametry a návratové hodnoty metod, případně atributy).

Jinak jedna možnost je dependency injection, ale v mnoha situacích to není ani potřeba.
Třeba, jednoduchá aplikace, pár objektů a globální konfigurace, která se na začátku nějak načte a pak se z ní čtou hodnoty.
Tady podle mě bude stačit i normální těsná závislost:

class Foo {
  private $config;
  
  public function __construct ($conf) {
    $this->config = $conf;
  }
}

// hlavní skript
$config = new Configuration();
$config->load("config.xml");

$foo = new Foo($config);
Jan Tvrdík
Profil
snazimse:
V prvé řadě je ideální se globálnímu přístupu úplně vyhnout, protože přináší vždy omezení. Částečně je to dané i jazykem. Např. v PHP jsou názvy tříd v globálním prostoru, takže nemůžeš načíst zároveň dvě různé verze jedné knihovny. JavaScript třeba takové omezení nemá.

Pozor na to, že globální jsou v PHP i všechny konstanty a statické proměnné. Takže i těm je dobré se úplně vyhnout. Konstanty na třídách nicméně nevadí, protože třída je stejně globální tak jako tak.

Když už používat globální přístup, tak alespoň konzistentně a zřetelně napříč celou aplikací. V procedurálním kódu je třeba dobré mít konečný a velmi malých počet globálních proměnných s jasně danou strukturou. Někde na začátku to jednou celé inicializovat, a pak z toho jenom číst. Typické názvy takových globálních proměnných jsou $config, $global nebo $registry. Pokud je chceš použít ve funkci, tak normálně přes klíčové slovo global na prvním řádku.
snazimse
Profil
Rozumím tomu,že se zapouzdřením v oop,je to jasné,ty přístupy.Je to určitě i bezpečnější.Ale zdá se mi,že nad tím člověk musí fakt dost více přemýšlet.Než jak byly superglobální.Ale to je asi ta daň za o hodně větší bezpečnost a přehlednost,když už oop.

Jinak Tori: to mi nefungovalo ,postup ,je ,ale asi ok,ale nedokázalo to načíst ten soubor,protože to zrovna dělám ve header,kde se to načítá pak do všech souborů,pak se to načte do všecho a sekne se to samozřejmě nemůže fungovat,ale to jste nemohl vědět,jinak ok. Joker: Jo ok,díky za řešení. Takže stačí dát load toho souboru a pak si vytvořit instanci a používat,dále.
Nic víc?

Vytáhl jsem si to takhle viz dole kod. Přes ten global,jak říká Jan Tvrdík.A to mi funguje perfektně.A přijde mi to fakt jednoduché.Díky!
function foo() {
 global $bar;

return $bar;
}





$bar2 = foo(); echo $bar2[1]; Pak jsem si to takhle použil. Vše ok,jen by mě zajímalo dá se to udělat i tak,že bych si tu funkci nemusel vkládat do další proměnné?
Joker
Profil
snazimse:
Ale zdá se mi,že nad tím člověk musí fakt dost více přemýšlet.Než jak byly superglobální
Spíš si osvojit určitý způsob přemýšlení.
Ale přemýšlení nad prvotním návrhem aplikace obvykle ušetří později řádově víc při údržbě a rozvíjení, takže se to vyplatí.

Viděl jsem aplikaci, která si deklarovala nějakou sadu globálních proměnných a na základě určitých podmínek vkládala další soubory, které si deklarovaly další globální proměnné anebo ty původní přepisovaly.
Absolutně se v tom nedalo vyznat, rozklíčovat z kódu hodnoty proměnných v nějakém místě bylo utrpení. Jediná použitelná metoda, jak zjistit, co se tam děje, byla navodit příslušnou situaci a odkrokovat v debuggeru. A samozřejmě kupa chyb vzniklá právě tím, že se v tom nedalo vyznat, tj. nějaká globální proměnná měla v určité situaci jinou hodnotu, než se očekávalo.
Alphard
Profil
snazimse:
jen by mě zajímalo dá se to udělat i tak,že bych si tu funkci nemusel vkládat do další proměnné?
Nikoliv funkci, ale návratovou hodnotu.
A ano, dá, stačí použít současnou verzi PHP (snad stačí 5.4, nechce se mi to hledat), která akceptuje zápis echo foo()[1].

Joker:
Viděl jsem aplikaci, která si deklarovala nějakou sadu...
Od toho je lepší dát ruce pryč :-)

Obecně rozumné použití global nemusí být vždy katastrofa, bohužel ho často využívají lidé, kteří nejsou schopní navrhnout aplikaci dobře a z posledních sil hledají cokoliv, co pomůže. Tam neexistuje jednoduchá rada, zkušenosti se získávají postupně, třeba to příště udělají líp.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: