Autor Zpráva
Tomášeek
Profil *
Ahojte,

zkouším teď rozjet nějakou běžící a jinde fungující aplikaci na serveru s PHP 5.3.3.7 (ano, letité, upgrade nyní nepřichází v úvahu, bohužel).

Kód je následující:

<?php
namespace x\y;

use a;
use b;
use c;

class d implements e 
{
    use f; // tady je chyba

    private g;
    ...
}
?>

Chybovou hlášku jazykově chápu, ale nedaří se mi najít, proč k ní dochází, ani po vyhledávání nejsem moudřejší (jasně, PHP očekává funkci namísto use). Přitom o pár řádků výše use evidentně funguje/projde. Našel jsem jen rady typu "upgrade na PHP 5.4", byly z doby pár let zpět. To ale není v tuto chvíli možné. Bohužel.

Jak této chybě předejít (resp. to řešit starším povoleným způsobem, tzn. jak nahradit use funkcí tak, aby funkčnost zůstala stejná), a proč vzniká zrovna v tomto místě? Zkoušel jsem use přesunout k ostatním, to ale končilo také chybou (jinou). Důvod užití use na tomto místě má asi svůj účel.

Poznámka: jména jsem přepsal pro ukázku kódu, nemyslím, že jsou nyní podstatná a nevím, jestli je vynášet ven.

Děkuji.


PS: poznámky o stařičké verzi PHP prosím nechte stranou, vím o ni a nemohu s ní momentálně nic dělat.
juriad_
Profil *
V tomto případě se vůbec nejedná o namespacy, ale traity, a ty jsou podporované od PHP 5.4.
php.net/manual/en/language.oop5.traits.php

Můžeš zkusit místo use f; přímo vložit obsah trait f { ... }. Toto by mělo fungovat v jednoduchých případech, ale v těch složitějších bude nutné hodně ručního ladění, kvůli dědičnosti a řešení konfliktů.
Tomášeek
Profil *
juriad:
O traitu jsem četl, tvůj kód jsem asi také možná zkoušel, končil chybou unexpected T_STRING, expecting T_FUNCTION, protože podpora Traitů je od PHP 5.4, viz i tvůj uvedený odkaz.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: