• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

getData - nie pobiera danej

Object Storage Arubacloud
0 głosów
295 wizyt
pytanie zadane 12 sierpnia 2017 w PHP przez sonewbie Użytkownik (690 p.)

Hej,

mam takie coś:

 

v_login.php:

<body>

   <h1>
       <?php 
       echo $this->getData('nazwa'); 
       ?>
    </h1>
    <p>Akapit</p>
    
</body>


login.php:
<?php

include("models/m_template.php");

$Template = new Template();
$Template ->load("views/v_login.php");

$Template->setData('nazwa','jakaswartosc');
?>

m_template.php:

<?php

class Template
{
    function __construct()
    {
        
    }
    
    function load($url)
    {
        include($url);
    }
    
    private $data;
    
    function setData($name,$value)
    {
     $this->data[$name] = htmlentities($value, ENT_QUOTES);
    }
    
    function getData($name)
    {
        if(isset($this->data[$name]))
        {
            return $this->data[$name];  
        }
        else
        {
            return '';
        }
    }
}

?>

 

Nie zwraca mi się w pierwszym pliku 'nazwa'. Błędów żadnych nie wyrzuca i nie wiem w czym problem. Proszę o pomoc.

3 odpowiedzi

0 głosów
odpowiedź 12 sierpnia 2017 przez HaKIM Szeryf (87,590 p.)
edycja 12 sierpnia 2017 przez HaKIM

http://www.php-fig.org/psr/psr-1/

http://www.php-fig.org/psr/psr-2/

Spróbuj w v_login.php zamiast:

$this->getData('nazwa');

wywołać:

$Template->getData('nazwa');

Albo spróbuj...

$this->setData('nazwa', 'wartosc');
$this->getData('nazwa');

Poza tym to co robisz wydaje się być Kontenerem (Który nie powininen mieć za zadanie ładowania stron), zamiast tworzyć koło od nowa zalecam:

https://pimple.symfony.com/

I tak z innej beczki, na jakiego czorta Ci pusty konstruktor?

I tak z jeszcze innej beczki, co Ci daje zwrócenie pustego stringa w przypadku nie znalezienia indeksu? Nie lepiej jakiś Exception?

0 głosów
odpowiedź 12 sierpnia 2017 przez demotywatorking Obywatel (1,210 p.)
echo $this->getData('nazwa');


To chyba powinno być:
 

echo $Template->getData('nazwa');

 

0 głosów
odpowiedź 16 marca 2019 przez gambi Początkujący (350 p.)
<?php
 
class Template
{
    function __construct()
    {
         
    }
     
    function load($url)
    {
        include($url);
    }
     
    private $data;
     
    function setData($name,$value)
    {
     $this->data[$name] = htmlentities($value, ENT_QUOTES);
    }
     
    function getData($name)
    {
        if(isset($this->data[$name]))
        {
            return $this->data[$name];  
        }
        else
        {
            return '';
        }
    }
}
 
?>

Jako ze powyzsze kody pochodzą z pewnego kursu PHP... i go przerabiam obecnie mam pytanie i podepnę się pod ten temat...

Dopiero sie uczę dlatego tak wazne dla mnie jest zrozumienie tego kodu... a niestety autor w kursie nie do konca to wytlumaczyl. Bedde wdzięczny za odpowiedz.

1. Dlaczego jest wypisany konstruktor... który nic nie zawiera?

2. Nie do konca rozumiem słowo $this - mianowicie dlaczego autor najpierw deklaruje zmienna private $data a pozniej sie do niej odwoluje w funkcji setData i getData a nie robi tego tak

function setData($name,$value)
    {
     $name = htmlentities($value, ENT_QUOTES);
    }

i dlaczego w takim razie nie wpisuje takze value jako $this?

function setData($name,$value)
    {
     $this->data[$name] = htmlentities($this->data[$value], ENT_QUOTES);
    }

 

komentarz 16 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)

1. Dlaczego jest wypisany konstruktor... który nic nie zawiera?

Nie wiem, pusty konstruktor nic tu nie zrobi i nie ma żadnego sensu.

2. Nie do konca rozumiem słowo $this - mianowicie dlaczego autor najpierw deklaruje zmienna private $data a pozniej sie do niej odwoluje w funkcji setData i getData a nie robi tego tak

Aby odwołać się do właściwości obiektu trzeba użyć $this. Jeśli zrobiłby tak jak Ty zaproponowałeś to zmienna $name miałaby zasięg lokalny w tej metodzie, innymi słowy mówiąc można by na niej operować tylko w tej metodzie i tylko w trakcie jednego wywołania. Gdybyś zrobił setData ustawiając w niej $name to robiąc getData tego $name by już nie było. Właściwość obiektu będzie trzymana cały czas podczas jego istnienia.

i dlaczego w takim razie nie wpisuje takze value jako $this?

Bo $value przekazuje do konkretnej metody jako argument i ona działa jak zwykła zmienna. Finalnie dzięki temu ma właściwość data, w której trzymane jest coś przez całe życie obiektu (może cały czas coś dopisywać), a do metody podaje nazwę i wartość, aby jednorazowo ustawić wartość i o tych danych zapomnieć (zostanie tylko $data z dopisanymi danymi).

komentarz 20 marca 2019 przez gambi Początkujący (350 p.)

@gambi,
dzieki za rzeczową odpowiedź! mam jeszcze pytanie o dalszą część.... bo w dalszej części klasy stworzone zostały 3 kolejne funkcje i zmienna prywatna   

private $alertTypes;

 function setAlertTypes($types){
        $this->setAlertTypes = $types;
    }
    
    function setAlert($value, $type = null){
        if($type == ''){
            $type = $this->alertTypes[0];
        }
        $_SESSION[$type][] = $value;
    }
    
    function getAlerts(){
        $data = '';
        foreach($this->setAlertTypes as $alert){
            if(isset($_SESSION[$alert])){
                foreach($_SESSION[$alert] as $value){
                    $data .= '<li class="alert alert-' . $alert . '">' . $value . '</li>';
                }
                unset($_SESSION[$alert]);
            }
        }
        return $data;
    }

1. po co wogole zostala utworzona ta zmienna private $alertTypes; skoro w funkcji jest uzywana tylko w tym miejscu $type = $this->alertTypes[0]; i skąd w niej jest jakakolwiek wartosc w tym miejscu bo skoro $type jest puste... to przypisz  do niej $this->alertTypes[0] ale skąd $this->alertTypes[0]  ma jakąkolwiek wartość?

2. czemu sluzy ten drugi nawias kwadratowy w zapisie   $_SESSION[$type][] = $value; ? czy to znaczy ze jest to tablica?

komentarz 20 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)

Podstawowe pytanie: czy w poniższych miejscach nie powinno być ->alertTypes? setAlertTypes jest metodą, a tu próbujesz jej użyć jak właściwości i nie widzę w tym logiki.

        $this->setAlertTypes = $types; 
        foreach($this->setAlertTypes as $alert){ 

1. Z tego co rozumiem metodą setAlert można dodawać nowe alerty dla danego typu i wtedy metoda getAlert miałaby je zwracać. Ale tego obecnie nie zrobi i jednocześnie właściwość alertTypes miałaby jeszcze więcej sensu, gdyby potwierdziło się to, co napisałem wyżej.

2. Dodaje kolejny element tablicy do klucza z $type. Powstanie więc jedna duża tablica, która pod każdym kluczem ($type) będzie zawierała kolejną tablicę z elementami z $value.

komentarz 22 marca 2019 przez gambi Początkujący (350 p.)

Tez mi się tak wydawało że powinno być zamiast setAlertTYpes - alertTypes, ale w kursie tak jest jak powyżej. Metoda słuzy do ustawienia typu komunikatu i samego komunikatu alertu  robi to sie w ten sposob

$SK->Template->setAlert('Uzupełnij wymagane pola','error');

a pozniej wyswietla go tak:

 <?php
                $alerts = $this->getAlerts();
                if($alerts != '') {
                    echo '<ul class="alerts">' . $alerts . '</ul>';
                }
            ?>

No i faktycznie wyswietla te alerty. Więc nie wiem, moze nie wyswietli kilku na raz? Tylko pojedynczy.

Podobne pytania

0 głosów
0 odpowiedzi 139 wizyt
pytanie zadane 7 czerwca 2019 w PHP przez Neronys Bywalec (2,090 p.)
+1 głos
1 odpowiedź 232 wizyt
pytanie zadane 12 stycznia 2018 w PHP przez niezalogowany
0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 9 lutego 2016 w PHP przez Kewin Sikorski Nowicjusz (140 p.)

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...