• 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

VPS Starter Arubacloud
–1 głos
133 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 293 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez jankustosz1 Nałogowiec (35,880 p.)
0 głosów
2 odpowiedzi 230 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...