Chybky v PHP 5.3
- Ondřej Mirtes
- Člen | 1536
Ahoj,
dnes jsem migroval aktuální projekt na PHP 5.3 a narazil jsem na chybku
v Nette:
V Nette\Loaders\LimitedScope by property $vars měla být deklarována jako
static. Jelikož není, tak metody LimitedScope::evaluate
a
load
vyhazují výjimku.
public static function evaluate(/*$code, array $vars = NULL*/)
{
if (func_num_args() > 1) {
self::$vars = func_get_arg(1);
extract(self::$vars);
}
return eval('?>' . func_get_arg(0));
}
public static function load(/*$file, array $vars = NULL*/)
{
if (func_num_args() > 1) {
self::$vars = func_get_arg(1);
extract(self::$vars);
}
return include func_get_arg(0);
}
Dále jsem nepřišel na to, jak zapisovat callbacky statických metod. Nevím, jestli je to chyba Nette nebo PHP, ale měl jsem s tím následující problém:
$template->registerHelper('time', array('\Classes\Helpers','timeHelper'));
//a také
$template->registerHelper('time', '\Classes\Helpers::timeHelper');
…vyhazovaly, že uvedené callbacky nejsou callable. Vyřešilo to přepsání metod na instanční:
$template->registerHelper('time', array(new \Classes\Helpers,'timeHelper'));
Ale co mě také zarazilo, že fungovalo toto:
$cokoli = new \Classes\Helpers;
$template->registerHelper('time', array('\Classes\Helpers','timeHelper'));
//a také
$template->registerHelper('time', '\Classes\Helpers::timeHelper');
Tento kód už výjimku nevyhazoval, snad jsem něco nepřehlédl.
Ještě v bodech
- Spíš obecný PHP dotaz – lze nějak zapsat obdobu import z Javy? Mám na mysli import celého namespace, tedy toto:
//chci:
use Nette\Application;
$form = new AppForm; //je v Nette\Application namespace
//nyní se musí dělat takto:
use Nette\Application\AppForm;
$form = new AppForm;
//nebo takto:
use Nette\Application;
$form = new Application\AppForm;
- Dibi by si zasloužilo verzi pro PHP 5.3, nikde jsem ji nenašel. Musel jsem
upravit implementaci interface
Nette\IDebuggable
vDibiException
. - Myslel jsem, že David vyvíjí Nette nativně v PHP 5.3? Na SVN v trunku jsou zakomentované namespaces. Takže vyvíjí v 5.2 a prefixed/namespaced verze generuje?
- Dibi i Texy by si zasloužily namespaced verze ;)
- Majkl578
- Moderator | 1364
V Nette\Loaders\LimitedScope by property $vars měla být deklarována jako static.
toto již zmínil zde
Dále jsem nepřišel na to, jak zapisovat callbacky statických metod.
nevím z jakého důvodu, ale s \ na začátku to nefunguje, toto ano:
$template->registerHelper('time', '\Classes\Helpers::timeHelper');`
import celého namespace
To nepůjde, můžeš akorát udělat alias, třeba:
use Nette\Application as App;
$form = new App\AppForm;
Dibi by si zasloužilo verzi pro PHP 5.3, nikde jsem ji nenašel. Musel jsem upravit implementaci interface Nette\IDebuggable v DibiException.
s tím souhlasím, ale nedostalo se mi odpovědi.
Myslel jsem, že David vyvíjí Nette nativně v PHP 5.3?
To se tu nedávno řešilo, také bych to uvítal, nebaví mě pořád stahovat archiv a extrahovat si 5.3 verzi.
Dibi i Texy by si zasloužily namespaced verze ;)
viz předchozí odpověď k dibi :)
- David Grudl
- Nette Core | 8228
Jde o chybu v PHP, zareportoval jsem ji. Přidám fix do Nette.
Zatím vyvíjím vše v 5.2, takže 5.3 není z mé strany nijak testována, jen se snažím psát dobře.