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

NIezrozumiała linijka kodu

Object Storage Arubacloud
0 głosów
393 wizyt
pytanie zadane 2 listopada 2015 w PHP przez Silverwind Użytkownik (730 p.)
class App
{
	protected $controller ="home";
	
	protected $method ="index";
	
	protected $params =[];
	
	public function __construct()
	{
		
            $url=($this->parseUrl());
            
             print_r($url);
            if(file_exists("../app/controllers/".$url[0]."php"))
            {
                $this->controller = $url[0];
                unset($url[0]);
               
           
            }
            require_once '../app/controllers/'.$this->controller .".php";
            //echo $this->controller;
            $this->controller = new $this->controller;// nie rozumiem tego dostępu 
              
            }
	}
	
	public function parseUrl()
	{
		if(isset($_GET["url"]))
		{
			return $url = explode("/",filter_var(rtrim($_GET["url"],"/"),FILTER_SANITIZE_URL));
		}
	}
}

Plik znjduje się w folderze 

../app/controllers/Home.php;
<?php

class Home extends Controller
{
    function index()
    {
	echo "home/index.<br/>";
    }	
}
 

?>

 

 

Uczę się z tutoriala tworzenia prostego wzorca projektowego MCV powyżje przedstawiłem kod.

1.Mam czasami problem ze zroumienie  kojeności wykonywanych funkcji i przypisań kolejnych zmiennych  . Znacie jakieś strony gdzie można podglądnąć grficznie jak on jest pokolei  realizowany.

2.

require_once '../app/controllers/'.$this->controller .".php";//tutaj  dołączony jest kod z pliku home.php
            
            $this->controller = new $this->controller;// nie rozumiem tego dostępu tworzy się tutaj nowy obiekt klasy home ale jakoś nie moge to sobie w głowie po układać ( zmienna home = nowy obiekt Home) 
 Może ktoś z was  pomorze mi  to lepiej zrozumimieć.              

2 odpowiedzi

+1 głos
odpowiedź 2 listopada 2015 przez furas Maniak (53,800 p.)
wybrane 2 listopada 2015 przez Silverwind
 
Najlepsza

$this->controller = new $this->controller;

W PHP ta sama zmienna może w różnych momentach przechowywać dane różnego typu - tekst, liczbę, obiekt.

W powyższym przypadku pewnie gdzieś wcześniej do zmiennej `$this->controller` był przypisany tekst z nazwą klasy a teraz na podstawie tej nazwy tworzony jest obiekt i ten obiekt zostaje przypisywany do tej samej zmiennej.

---

W jakimś frameworku już widziałem podobne zachowanie. Definiowało się nową klasę (która dziedziczyła po klasie Controller), a w niej tworzyło się zmienną $template z tekstową nazwą szablonu strony. Klasa w konstruktorze na podstawie tej nazwy sama tworzyła obiekt zawierający ten szablon i przypisywała go ponownie do zmiennej $template. W pozostałych metodach klasy można było już korzystać z $template jak z obiektu a nie tekstu. 

komentarz 2 listopada 2015 przez Silverwind Użytkownik (730 p.)
edycja 2 listopada 2015 przez Silverwind
Czyli jak w zmiennej jest przypisana  nazwa klast jako string to mogę tak tworzyć nowe obiekty(this->$jakaśzmienna). Ciekawe rozwiązanie. Znowu nauczyłem się czegoś nowego. Dzięki za pomoc!!
komentarz 2 listopada 2015 przez furas Maniak (53,800 p.)
W tej części `$this->controller` na pewno zawiera tekst z nazwą kontrolera.

Zawsze możesz nawstawiać `echo`  aby wypisywało co zawierają zmienne, jakiego typu są te dane. Do tego możesz pododawać wypisywanie komunikatów typu "jestem w konstruktorze klasy X", "metoda X.parseUrl" i oglądać w jakiej kolejności się one pokazują.

Istnieje też biblioteka dla PHP, która pozwala komunikaty wyświetlać w konsoli przeglądarki niż na generowanej stronie co może być przydatniejsze.
https://github.com/fedosov/webug

---

Zamiast echo możesz dać var_dump oraz HTML-owy tag <pre> aby dobrze sformatowało dane na stronie WWW - aby znak "\n" przenosił do nowej linii a nie był ignorowany przez przeglądarkę)
0 głosów
odpowiedź 2 listopada 2015 przez Boshi VIP (100,240 p.)
edycja 2 listopada 2015 przez Boshi
Dobrze na pewno to przepisałeś?  nie widzę sensu czegoś takiego; $this->controller = new $this->controller; Ciężko stwierdzić co to oznacza. Wcześniej tez wykorzystywany jest ten atrybut do przypisania url-a.  Ba to nie ma prawa działać. Tworzysz obiekt z  czego?  z atrubutu urla?

Strasznie ciężko się w tym połapać... z kąd to wziąłeś?
Jest coś takiego jak debugger...
komentarz 2 listopada 2015 przez efiku Szeryf (75,160 p.)
Debugger i jedziemy ;)

Podobne pytania

0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 24 stycznia 2017 w C i C++ przez wariat95 Nowicjusz (190 p.)
+1 głos
1 odpowiedź 436 wizyt
pytanie zadane 11 stycznia 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 186 wizyt
pytanie zadane 5 września 2020 w Python przez Igorek Mądrala (6,290 p.)

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,957 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!

...