Portál AbcLinuxu, 9. května 2025 00:12

Dotaz: PHP - Jak vytvořit instanci jejíchž název vrací metoda.

22.4.2014 00:18 MAF
PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Přečteno: 461×
Odpovědět | Admin
Ahoj. Potřebuji mimo třídu Foo vytvořit novou instanci třídy, Název této třídy vrací metoda selClass() uvnitř třídy Foo. Problém je, že dostávám stále chybu: Class name must be a valid object or a string...
...
public function selClass(){
return 'Home()';
}
...

new $foo->selClass();
zkoušel jsem i return string('Home()'); ale výsledek stejný. poradí někdo? Díky

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.4.2014 00:46 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je to sice zvláštní přání, ale PHP to umí:
<?php
class Foo {
    public function selClass() {
        return 'Home';
    }
}

$foo = new Foo();
$class = $foo->selClass();
$home = new $class();
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
22.4.2014 00:49 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Obvykle se to dělá trochu jinak, např. takhle:
<?php
class Foo {
    public function selClass(){
        return new Home();
    }
}

$foo = new Foo();
$home = $foo->selClass();
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
22.4.2014 00:56 MAF
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Jenže tohle si budu pamatovat tak dneska, za týden to budu hledat... Metoda selClass() vrací stríng, aspoň to píše var_dump() a stejně se mu to nelíbí. Nejde to ještě nějak jinak baz použití další $var a vytvořit instnci až mimo tu class Foo ? Díky
23.4.2014 11:46 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Tohle se hodí, pokud se jméno třídy načítá jako string z konfigurace:
new $class();
Tohle se hodí, pokud to má být napevno zadrátované v kódu:
return new Home();
Oba případy mají své oprávněné užití. Výhodo druhého řešení je fungující autocompletion v editoru kódu. To v prvním případě nebude fungovat, protože editor neví, co bude obsahem proměnné.

-- OldFrog
24.4.2014 10:02 kozzi11
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Co se tyce doplnovani kodu, tak lepsi IDE dokazi napovidat v obou pripadech, samozrejme je jim treba trochu pomoci napriklad pomoci PHPDoc
24.4.2014 15:07 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Nevidím žádnou cestu, jak by mohlo IDE vědět, kterou třídu instancuju, pokud načítám jméno třídy např. z databáze.

Pokud by šlo u metod specifikovat návratový typ (jeho interface), pak by to samosebou šlo. Ale jsme v php, ne v javě, takže na návratové typy můžeme zapomenout (nebo si nainstalovat http://hhvm.com/).

Nebo mi něco uniká? Používám Eclipse pro PHP.

Někdy to obcházím tím, že napíšu
false && $oIntance = new BaseImplementation();
$oIntance = Factory::getInstance('TuhleImplementaciChci');
a on si pak Eclipse myslí, že $oIntance je typu BaseImplementation, ale je to jen takový hack.
-- OldFrog
25.4.2014 10:01 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Tohle by mělo fungovat, alespoň u mě to funguje
/* @var $oIntance TuhleImplementaciChci*/
$oIntance = Factory::getInstance('TuhleImplementaciChci');
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
25.4.2014 12:38 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Hmm, někde na tom mám asi uzel, protože mi to nefunguje...

Ale máte pravdu, že by to fungoval mělo:

http://www.only10types.com/2011/07/php-auto-complete-code-assist-in.html

Zkusím v novějším Eclipse (používám nějakou starší verzi).
-- OldFrog
25.4.2014 15:01 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Aha, takže takto mi to funguje:
	/**
	 * @return Vozidlo */
	public function getInstance(string $className){
		return new $className();
	}
...ale takto nefunguje (bez ohledu na verzi Eclipse či PDT):
	/** @return Vozidlo */
	public function getInstance(string $className){
		return new $className();
	}
Je to tak normální?
-- OldFrog
25.4.2014 10:36 kozzi11
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Prave ze definovat navratovy typ v PHPDoc jde, coz lepsi IDE umi velmi odbre pouzivat. Jinak ze zkusenosti muzu rict ze zrovna Eclipse neni pro PHP idealni, o neco lepe se pracovalo s NetBeans a uplne neporazitelny je PhpStorm
25.4.2014 12:43 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Eclipse není pro PHP nejlepší, ale zase používám, na co jsem zvyklý :-)
-- OldFrog
24.4.2014 12:05 dword
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Doporucuji cvicit vice logickou pamet a jist vice cesneku :)
Josef Kufner avatar 25.4.2014 15:00 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Zas tak zvláštní to není. Pokud chceš aplikaci poskládat z modulů, je toto elegantní cesta, jak z konfiguračního souboru vyrobit instanci aplikace, která je poskládána mnoha různých objektů. U jiných řešení, vyjma generování kódu factory objektů, nebudeš mít možnost jen tak nějaký modul přidat (přikopírovat pár souborů) a připsat ho do konfiguračního souboru bez nutnosti ručně sahat do jakéhokoliv kódu.

Jen je potřeba ohlídat nedůvěryhodná vstupní data (hlavně pokud je autoloader příliš chytrý) a ošetřit možnost, že požadovaná třída neexistuje (aby to nepadlo na hubu moc, ale jen trochu a hezky).
Hello world ! Segmentation fault (core dumped)
24.4.2014 10:08 kozzi11
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Odpovědět | | Sbalit | Link | Blokovat | Admin
$object = (new ReflectionClass($foo->selClass()))->newInstance()
28.4.2014 08:08 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
Odpovědět | | Sbalit | Link | Blokovat | Admin
chceš-li vytvořit proměnnou s názvem, a ten název vrací instance, imho máš to špatně vymyšlený. Neznáš-li název proměnné předem, jak na ni chceš odkazovat později? nepřímo ?

pokud chceš jen vrátit nějaký řetěz z vyvolané instance, tak no problemo
28.4.2014 11:17 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: PHP - Jak vytvořit instanci jejíchž název vrací metoda.
chceš-li vytvořit proměnnou s názvem, a ten název vrací instance, imho máš to špatně vymyšlený
Nikoli - to on nechce. Nejde o název ale o typ proměnné. On chce vytvořit proměnnou daného (předem neznámého) typu. Pokud by šlo o název, musel by tam být ten dolar zdvojený:
$$var = 'x';
-- OldFrog

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.