• 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

–1 głos
97 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,420 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,420 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 198 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez jankustosz1 Nałogowiec (30,160 p.)
0 głosów
2 odpowiedzi 181 wizyt

85,871 zapytań

134,643 odpowiedzi

298,914 komentarzy

56,738 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 926p. - rucin93
  2. 925p. - Whistleroosh
  3. 912p. - nidomika
  4. 876p. - adrian17
  5. 867p. - Michal Drewniak
  6. 866p. - Mikbac
  7. 863p. - Mateusz Bogdan
  8. 859p. - CC PL
  9. 797p. - Argeento
  10. 704p. - ScriptyChris
  11. 683p. - tokox
  12. 660p. - Vinox
  13. 645p. - TheLukaszNs
  14. 642p. - s. Dorota Kowalewska
  15. 601p. - Marcin Harasimowicz
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...