php zmienna dla wszystkich plików

0

jak zrobić zmienną dostępną dla wszystkich plików .php

6

Zobacz opis w dokumentacji:
https://www.php.net/manual/en/language.variables.scope.php
Jednak opisz może bardziej co chcesz uzyskać bo może problem da się rozwiązać inaczej, no i raczej nie tworzy się na siłę zmiennych globalnych.

0

Ja bym przechowywał w sesji :)

3
Luftkatze napisał(a):

jak zrobić zmienną dostępną dla wszystkich plików .php

To zależy jaki efekt chcesz uzyskać, i zależy w jaki sposób korzystasz z tych plików.

  1. Jeśli masz dwa pliki używane na dwa posoby (np cli.php oraz index.php) i chcesz korzystać z jakichś wspólnych danych, najlepiej byłoby je przechować w pliku plik.txt, plik.json lub plik.xml albo plik.yaml.
  2. Jeśli includujesz jeden plik w drugim (używając include() lub require()), to zmienne globalne zadeklarowane w jednym z nich, będą dostępne w drugim. Deklarowanie zmiennych globalnych to praktyką raczej słabą, ale jeśli już je zadeklarowałeś to one są dostępne w drugim pliku.
  3. Jeśli chcesz współdzielić wynik jakiejś operacji pomiędzy plikami, to lepiej zamknij tą funkcjonalnośc w funkcji lub w klasie, i skorzystaj z funkcji lub klasy z jednego pliku w innym.
  4. Jeśli przez "plik" rozumiesz różne podstrony które odwiedza użytkownik, to możesz przechować takie dane w sesji, w ciastku, wysyłając header, w tokenie JWT lub w bazie danych lub pliku statycznym.
  5. Jeśli jest jakiś inny powód; to wydaje mi się że najlepszym powodem byłoby przekazać parametry funkcji w miejscu w którym ją wołasz.
  6. Jeśli korzystasz z autoloadera z composera i korzystasz z klas, to najpewniej musisz stworzyć instancję jednej klasy w drugim pliku, i przekazać zmienną przez parametr metody lub konstruktora.

Jak widzisz, to wszystko zależy co chcesz zrobić.

0

Możesz też użyć zmiennej statycznej klasy.

plik z klasą:

<?php
namespace containers;

class VarContainer {
  public static $myVariable = 0;
}

plik inny gdzie zmienną wykorzystujesz

<?php
\containers\VarContainer::$myVariable += 30;

w jeszcze innym pliku możesz pokazać zmienną

<?php
echo 'Wartość zmiennej: '.\containers\VarContainer::$myVariable;
0
TomRZ napisał(a):

Możesz też użyć zmiennej statycznej klasy.

plik z klasą:

<?php
namespace containers;

class VarContainer {
  public static $myVariable = 0;
}

plik inny gdzie zmienną wykorzystujesz

<?php
\containers\VarContainer::$myVariable += 30;

w jeszcze innym pliku możesz pokazać zmienną

<?php
echo 'Wartość zmiennej: '.\containers\VarContainer::$myVariable;

Niby tak, ale zmienne statyczne nie za bardzo się różnią od zmiennych globalnych, także nie zalecam. Mają te same problemy z utrzymaniem i błędy architektury, jak globale.

1

Zrób global`a i po kłopocie :-)
Jeśli to projekt dla kogoś to w sumie trochę tak jakbyś mu nasrał na wycieraczkę ale zadziała...

0

Niby tak, ale zmienne statyczne nie za bardzo się różnią od zmiennych globalnych, także nie zalecam. Mają te same problemy z utrzymaniem i błędy architektury, jak globale.

Jest jednak pewna różnica: mimo wszystko zmienne statyczne klas są bardziej eleganckie niż zwykłe globale, dają już jakąś tam enkapsulację.

Na przykład gdyby OP chciał mieć dwie zmienne o tej samej nazwie, to przy zwykłym globalu tego nie zrobi albo musi korzystać z tablicy, tymczasem tutaj moze zrobic np.:

\brand\car\Seat::$fullName
\brand\car\BMW::$fullName

0
TomRZ napisał(a):

Niby tak, ale zmienne statyczne nie za bardzo się różnią od zmiennych globalnych, także nie zalecam. Mają te same problemy z utrzymaniem i błędy architektury, jak globale.

Jest jednak pewna różnica: mimo wszystko zmienne statyczne klas są bardziej eleganckie niż zwykłe globale, dają już jakąś tam enkapsulację.

Czy Ty na pewno wiesz co to enkapsulacja?

Na przykład gdyby OP chciał mieć dwie zmienne o tej samej nazwie, to przy zwykłym globalu tego nie zrobi albo musi korzystać z tablicy, tymczasem tutaj moze zrobic np.:

\brand\car\Seat::$fullName
\brand\car\BMW::$fullName

To mówisz o przestrzeniach nazw.

Ze zmiennymi statycznymi nie ma mowy o enkapsulacji, dlatego że nie możesz ich zrefaktorować, tak żeby nie zmienić czegoś co z nich korzysta.

W trosce o Twój poprawny rozwój w dziedzinie progrmowania sugeruje nie oszukiwać się samemu, i nie próbować sobie wmówić że zmienne globalne złe, a zmienne statyczne dobre - taka droga prowadzi do nikąd.

Zmienne statyczne mają globalny scope, tak jak zmienne globalne. Nie należą do żadnej instancji, tak jak zmienne globalne. Nie można ich extendować polimorficznie, tak jak zmiennych globalnych. Mają wszystkie wady zmiennych globalnych. Tak, należą do klasy i musisz je poprzedzić Seat::$name albo BMW::$name, ale co z tego? Jedyne co osiągnąłeś to uniknąłeś kolizji nazw; ale wszystkie powody czemu zmienne statyczne są okropne nadal pozostają.

1 użytkowników online, w tym zalogowanych: 0, gości: 1