Skocz do zawartości

[PHP] Odwołanie do klasy bez global


Rekomendowane odpowiedzi

  • Administratorzy

Mam sobie np. taki kod:

 

class Sesja
{
public $username;

function __construct()
{
$this->username = 'Stefan';
}

}



class Skin
{

public function pokazStrone()
{
global $ses;
echo $ses->username;
}

}

// -- teraz główna część strony

$ses = new Sesja();
$skin = new Skin();

$skin->pokazStrone();

 

Da sie jakoś pominąć słowo global? Bo to psuje moim zdaniem całą frajdę i sens uyzywania OOP.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Po pierwsze niestety php pod tym względem jest głupie, bo języki c podobne zawsze mają zasięg do nadrzędnych zmiennych. Możesz używać zmienną $GLOBALS jeśli nie podoba się global.

 

Poza tym twój kod zawiera błąd logiczny, ale rozumiem że zapewne chciałeś tylko potestować. Z metody klasy Skin odwołujesz się bezpośrednio do pola obiektu Sesja co już nam pokazuje, że nie różnicujesz obiektów sesji, dlatego też klasa Sesja powinna być klasą statyczną i dzięki temu będzie dostępna bez użycia magicznego słowa global. Jednakże pomijając już ten fakt, możesz zrobić coś takiego:

 

class Sesja
{
public $username;
private static $sessions = array();

private function __construct( $username = 'Stefan' )
{
$this->username = $username;
}

public static function PobierzSesje( $username = 'Stefan' )
{
if ( !isset( self::$sessions[$username] ) self::$sessions[$username] = new Sesja( $username );

return self::$sessions[$username];
}

}

 

I teraz zeby pobrac sesje domyslnego uzytkownika pisze byle gdzie:

$obiekt_sesji = Sesja::PobierzSesje();

 

a jesli konkretnego to:

$obiekt_sesji = Sesja::PobierzSesje('Jurek');

 

edit:

Zawsze mozesz zrobic to samo co wiekszosc frameworkow, a mianowicie dorob jedna glowna klase statyczna, ktora przechowuje referencje do obiektow, ktore bedziesz uzywal. :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Mam tak:

<?php

class HMT
{
    public static $modules = array();
    public static $costam = 'a';
    
    public static function Init()
    {
        self::$modules['core'] = new Core;
        self::$modules['session'] = new Session;
        
        self::$modules['core']->setSess( self::$modules['session'] );
    }
}

class Core
{
    public $wersja;
    private $sess;
    
    function __construct()
    {
        $this->wersja = '0.1';
    }
    
    public function setSess( $id )
    {
        $this->sess = $id;
    }
    
    public function showUserInfo()
    {
        echo $this->sess->user;
    }
}

class Session
{
    public $user;
    
    function __construct( $user = 'Stachu' )
    {
        $this->user = $user;
    }
    
    function setName( $user = 'Stachu' )
    {
        $this->user = $user;
    }
}


HMT::Init();

echo HMT::$modules['core']->wersja;
echo '<br />';
echo HMT::$modules['session']->user;
echo '<br />';
echo HMT::$modules['session']->setName('Edek');
echo '<br /><B>Info o userze z Core</B><br />';
echo HMT::$modules['core']->showUserInfo();
?>

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Jeszcze dopisz przed deklaracją klasy HMT static oraz zabezpieczonko przed powtórną inicjalizacją i będzie gitara. :) Natomiast w klasie Session jak masz setName to dorób jeszcze getName i ukryj pole zmieniając public na private.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...