Chybky v PHP 5.3

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Mirtes
Člen | 1536
+
0
-

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 v DibiException.
  • 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
+
0
-

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 :)

LM
Člen | 206
+
0
-

LastHunter napsal(a):

  • Dibi by si zasloužilo verzi pro PHP 5.3, nikde jsem ji nenašel. Musel jsem upravit implementaci interface Nette\IDebuggable v DibiException.

V Nette distribuci pro php5.3 je v 3rdparty dibi verze ve které je toto opravené.

David Grudl
Nette Core | 8228
+
0
-

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.