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

Przekazanie nazwy klasy w tablicy której obiekt ma zostać utworzony - foreach zamiast switch

Object Storage Arubacloud
–1 głos
135 wizyt
pytanie zadane 26 stycznia 2018 w PHP przez kevin Mądrala (5,010 p.)

Witam!

Czy PHP oferuję jakość możliwość przekazywania przez argument klasy której obiekt ma zostać stworzony ? Czy tylko przez argument mogę przekazać obiekt klasy. Dla przykładu, ?

class WebManager
{
	$item = null;
	public function set(array $param)
	{
		$ret = null;
	
		if ( (isset($_GET['c'])) || (empty($_GET['c'])) ) {

			foreach ($param as $key => $value) {
					if($key == $_GET['c']) {

					$this->item = new $value; // ?? !!
					break;
				}
			}

			if($this->item == null) {
				// nieznany parametr get
				// load default
				$this->item = new Default();
			}
		} else {

			//load deafult
			$this->item = new Default();
		}
	}
}

$web = new WebManager();
$in = array('main'=>'', 'about'=>'', 'contact'=>'');
$web->set($in);

Rozwiązać to mogę za pomocą switch() ale tak się zastanawiam czy jest rozwiązanie pozwalające na dodanie w tym wypadku nowej podstrony dzięki któremu nie będę musiał ingerować w kod tej funkcji a jedynie dodam parametr w tablicy z nazwą oraz jaka to jest klasa.

Po co mi to potrzebne ?

Mam stronę która ma n-podstron każda podstrona osiada swoją klasę w której są dwie funkcje draw z kodem html oraz init <-funkcja ta jest dla klasy głównej która zwraca jakie style/skrypty potrzebuje dana podstrona.

Tutaj pojawia się pytanie: Czy ZBRODNIĄ jest dołączenie wszystkich definicji tych klas w klasie głównej ? Np.

class MainSubPage{...} <- plik main-page.php

class AboutSubWebPage {...} <- plik about.php

class ContactSubPage {...} <- plik contact.php

itd.

I jest osobny plik z klasą główną/zarządzającą który posiada require('subpage/main-page.php'); require('subpage/about.php'); itp. Tylko pojawia się pytanie po co dołączać te pliki skoro i tak zostanie użyty tylko jeden ? Czy to już jest za duże dążenie do pewnego idealizmu ? I Dołączenie poprzez require tylko definicji klas nie jest obciążeniem ani nie spowoduję jakiegoś zapchania serwera ?

 

1 odpowiedź

0 głosów
odpowiedź 26 stycznia 2018 przez kevin Mądrala (5,010 p.)

Dobra zrobiłem :) Chyba się nie sprecyzowałem. Istnieje główna klasa zawierająca jedną z tych klas. W tej chwili główny plik klasy zawiera definicje wszystkich klas, które go rozszerzają. Zadałem to pytanie, ponieważ wydaje mi się, że jest to zła praktyka, gdy plik z główną klasą zawsze zawiera deklaracje klas, których nie będzie używał. Więc potrzebowałem kodu:

function get(string $className, string $classFile)
{
	if (!file_exists($classFile)) {
		echo 'err !';
		return;
	}
	
	include($classFile);
	
	if(!class_exists($className)) {
		echo 'err !';
	}

	return new $className();	
}

Ale czy dołączenie pliku z deklaracją klasy jest poprawne ? W tym pliku mam dla przykładu class MainSubPage { public function draw() {... } public function init() {... } } I coś takiego dołączam w funkcji. Czy to w niczym nie przeszkadza ?

komentarz 26 stycznia 2018 przez efiku Szeryf (75,160 p.)

Jest coś takiego jak Routing, Composer ;)  pobadaj teren :)

komentarz 26 stycznia 2018 przez kevin Mądrala (5,010 p.)
Tak, ale czy dołączenie pliku ( w którym jest tylko deklaracja klasy ) w funkcji w niczym nie przeszkadza ? Nie jest to praktyka której należy unikać ?
komentarz 26 stycznia 2018 przez efiku Szeryf (75,160 p.)
Tak się nie robi.

Obadaj dokumentację komponentów wyżej szczególnie na Routing i Controller ;)
Wtedy zobaczysz jak to się robi w php2017. Może wpadnie Ci do głowy lepszy pomysł na zarządzanie tym, uruchomisz composera itd.
komentarz 27 stycznia 2018 przez kevin Mądrala (5,010 p.)

?? Kurs o MVC http://lukasz-socha.pl/php/mvc-w-praktyce-%E2%80%93-tworzymy-system-artykulow-cz-1/

Kod wyciągnięty z wyżej wymienionej strony, kod odpowiada za wczytanie DEKLARACJI KLASY View w funkcji czyli to o co ja się pytałem. Więc czemu tak się nie robi ?

public function loadView($name, $path='view/') {
        $path=$path.$name.'.php';
        $name=$name.'View';
        try {
            if(is_file($path)) {
                require $path;
                $ob=new $name();
            } else {
                throw new Exception('Can not open view '.$name.' in: '.$path);
            }
        }
        catch(Exception $e) {
            echo $e->getMessage().'<br />
                File: '.$e->getFile().'<br />
                Code line: '.$e->getLine().'<br />
                Trace: '.$e->getTraceAsString();
            exit;
        }
        return $ob;
    }

 

Podobne pytania

0 głosów
2 odpowiedzi 305 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez jankustosz1 Nałogowiec (35,880 p.)
0 głosów
2 odpowiedzi 231 wizyt

92,543 zapytań

141,386 odpowiedzi

319,499 komentarzy

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

...