2012-11-09 22 views
10

Tworzę podstawową strukturę PHP. Muszę przekazać dane dotyczące bieżącej strony do różnych funkcji, pozwolić im na modyfikację i zapisanie, a następnie przekazać je z powrotem do wyświetlanej strony. Początkowo planowałem przechowywać dane w zmiennej globalnej, takiej jak $GLOBALS['data'], ale zaczynam myśleć, że używanie globalnego jest złym pomysłem. Myślę więc, że zamiast tego wstawię zmienną statyczną do klasy systemowej i uzyskam do niej dostęp za pomocą system::$data. Moje pytanie brzmi: co byłoby lepsze i dlaczego?Zmienne globalne a statyczne w PHP

to:

$GLOBALS['data'] = array(); 
$GLOBALS['data']['page_title'] = 'Home'; 
echo $GLOBALS['data']['page_title']; 

Albo to:

class system 
{ 
    public static $data = array() 
} 

function data($new_var) 
{ 
    system::$data = array_merge(system::$data, $new_var); 
} 

data(array('page_title' => 'Home')); 
echo system::$data['page_title']; 

Odpowiedz

11

Tam naprawdę nie ma różnicy między zmienną globalną i zmiennej public static. Zmienna klasy jest nieco lepiej widoczna, ale nie ma to większego znaczenia. Oba są dostępne w dowolnym miejscu w dowolnym czasie i oba są stanem globalnym.

Jak to się dzieje, po prostu napisał wyczerpujący artykuł na ten temat:
How Not To Kill Your Testability Using Statics

+4

niesamowity artykuł –

+0

Czy występuje różnica w wydajności? Wygląda na to, że globale nie są tak wydajne, jak użycie zmiennej statycznej. –

+2

@Kyle ** To nie ma znaczenia. ** Poważnie. Prawdopodobnie istnieje różnica, ale jest tak astronomicznie mała, że ​​nie ma znaczenia. Twoim najwyższym priorytetem powinno być pisanie kodu, który jest utrzymywany, logiczny, czytelny i wszystkie inne rzeczy powinny być kodami. Globalne i "publiczne statyczne" zmienne są zarówno straszne w tym celu. – deceze

1

Więc moje pytanie jest, co byłoby lepsze i dlaczego?

Już wyczuwasz, że jest jakiś problem z umieszczeniem tego wszystkiego w globaliach. Chociaż rozwinęliście niektóre myśli, by zamknąć rzeczy w klasy.

Myślę, że to dobry punkt wyjścia. Dodajmy trochę więcej przypraw do gotowania, aby to bardziej płynnie na początku:

$data = new ArrayObject(array()); 
$data['page_title'] = 'Home'; 

Został utworzony obiekt teraz, że można przejść zawierający dane. Wystarczy przekazać $data do obszaru, w którym jest to potrzebne. Nie jest wymagana globalna lub globalna zmienna statyczna.

Możesz nawet uczynić ten rodzaj bardziej konkretnym, rozszerzając od ArrayObject swój własny typ.

+0

Jako FYI, całkowicie niezwiązane z tym postem, nie możemy już migrować pytań starszych niż 60 dni. – NullUserException

+0

@NullUserException: Dziękujemy za powiadomienie. – hakre