[PHP] cannot redeclare function terwijl dat niet gebeurt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
Goedemorgen,
ik loop tegen een vreemd probleem aan: ik krijg van PHP de volgende foutmelding terug:
Fatal error: Cannot redeclare checkchilds() (previously declared in ***.php:294) in ***.php on line 294
Dit is vreemd, omdat de functie maar één keer gedeclareerd wordt. Regel 294 bevat het volgende:
PHP:
1
function checkChilds($pid, $level = 1) {

In alle bestanden die worden geïnclude is er echt maar één functie met de naam 'checkChilds', en als ik de naam van de functie verander in iets van bijvoorbeeld 'checkChildss', dan krijg ik de volgende foutmelding:
Fatal error: Call to undefined function checkchilds() in ***.php on line 317
Hoe is dit mogelijk?

Edit:
Wanneer ik de naam van de functie aan pas, en dit overal in het script doe waar in de functie aanroep, dan krijg ik dezelfde error maar dan met de andere naam..

[ Voor 11% gewijzigd door Svennetjee op 06-05-2009 10:06 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Include je de bestanden met include() / require() of met include_once() / require_once(). Wanneer je twee keer de declaratie file include krijg je namelijk een redeclaration :)

Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
include(), maar daar heb je een punt :) Nog niet aan gedacht, eens even controleren of dat allemaal goed gebeurt..

Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
Hmm, ik heb vrijwel alle pagina's nagekeken, en waar nodig include() vervangen door include_once() en require() door require_once(), maar het probleem blijft bestaan. Al heb ik wel het gevoel dat ik het daarin moet zoeken..

Edit:
Excuus voor 'dubbelpost', had even edit knop moeten gebruiken..

[ Voor 17% gewijzigd door Svennetjee op 06-05-2009 10:15 ]


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Heel waarschijnlijk doe je toch ergens misschien een van je aanroepen verkeerd waardoor dat je eigenlijk die functie weer aan het declaren bent. Naar regel 294 moet je dan ook niet kijken. Je moet juist na regel 317 zoeken, want daar roep je de functie aan, maar bestaat hij nog niet. Gewoon een simpele Ctrl+F doen op "function <functie>" en je bent er zo achter. :)

Hmm, ik zie nu dat de foutmelding ook op regel 294 wordt getriggered, dat is op zich wel vreemd... Welke PHP versie gebruik je, de 5.3 development versie misschien?

[ Voor 18% gewijzigd door --MeAngry-- op 06-05-2009 10:20 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
--MeAngry-- schreef op woensdag 06 mei 2009 @ 10:18:
Heel waarschijnlijk doe je toch ergens misschien een van je aanroepen verkeerd waardoor dat je eigenlijk die functie weer aan het declaren bent. Naar regel 294 moet je dan ook niet kijken. Je moet juist na regel 317 zoeken, want daar roep je de functie aan, maar bestaat hij nog niet. Gewoon een simpele Ctrl+F doen op "function <functie>" en je bent er zo achter. :)
Doh :P Maar dat is juist het probleem, de functie wordt in elk mogelijk bestand maar één keer gedeclareerd, en ik ben net alle bestanden nog een keer nagelopen en alle includes worden nu gedaan met óf include_once() óf require_once()..

Edit:
En zo ziet regel 317 er uit ;)
PHP:
1
$childs = checkChilds($parent['id']);

[ Voor 6% gewijzigd door Svennetjee op 06-05-2009 10:21 ]


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Die functie ziet eruit alsof je hem recursief gebruikt, is dat ook zo? Doe je nog een functie-declaratie binnen je checkChilds() functie?

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Gebruik je dat PHP bestand binnen een groter geheel van een framework, bijvoorbeeld het Zend Framework of iets anders? Of is alle code helemaal van jezelf?

Anders kun je het nog via een smerig truucje zo oplossen:

PHP:
1
2
3
4
5
6
if (!defined('checkChilds') {
  function checkChilds($pid, $level = 1) { 
    // blablabla
  }
  define('checkChilds');
}


Dan wordt 'ie sowieso maar één keer aangemaakt.

Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
@--MeAngry--
Haha hoe raad je het ;) Maar dan nog, aan die oproep is weinig spannends..
PHP:
1
$childs = checkChilds($child['id'], ($level+1));


@HuHu
Hmm, nee alle code is zelf geschreven..

/Edit

Met het volgende 'trucje' ben ik er achter gekomen dat er iets op de een of andere manier toch twee keer wordt geladen:

PHP:
1
2
3
if(function_exists('checkChilds')) { die('functie bestaat al'); }
echo 'test<br />';
function checkChilds($pid, $level = 1) {


Op het scherm krijg ik dan:
test
functie bestaat al

[ Voor 62% gewijzigd door Svennetjee op 06-05-2009 10:28 ]


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

@HuHu:

Dan kun je beter
PHP:
1
2
3
if (!function_exists("checkChilds")) {
  function checkChilds() { }
}


gebruiken. :) Is wel een oplossing voor het probleem, maar het lijkt me toch verstandiger te kijken waar het nu echt fout gaat.

Het moet toch echt dat je nog ergens je bestand (met de functie) ergens nog een keer include. (Door de recursie?) Want gezien de foutmelding treedt de declaratie en de fout op dezelfde plek op. Je bent dit bestand dus twee keer (of meer) aan het doorlopen.

Kun je niet gebruik maken van een IDE met een debugger of iets dergelijks? Hoe groter je project wordt, hoe groter de kans wordt op dit soort "rare" fouten, en met een simpel breakpoint en door je code heen lopen heb je zo'n fout snel achterhaald.

[ Voor 49% gewijzigd door --MeAngry-- op 06-05-2009 10:31 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

@HuHu: Dat lijkt me meer symptoom bestrijding. Het lijkt me handiger wanneer het daadwerkelijke probleem opgelost wordt.

@Svennetjee: Het gaat niet over de oproep, het gaat om waar je de functie declareert. Wanneer die declaratie in een stuk code zit dat meerdere keren aangeroepen wordt, zal php de functie meerdere keren proberen te declareren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
Wat misschien ook een sleutel tot het oplossen van het probleem is, is dat ik de functie gebruik in een andere functie:
PHP:
1
2
function makePageTree() {
    function checkChilds($pid, $level = 1) {


Hoe ver reikt de scope van die checkChilds-functie nou eigenlijk?

Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Ah! Maar een declaratie binnen een andere functie is volgens mij ook global hoor. :) Zo'n functie include je 1 keer aan het begin van je programma-uitvoer en daar moet je het bij laten. Ik zou iets efficienter omgaan met de code die je schrijft en hoe je die hergebruikt. Het moet eigenlijk nooit nodig zijn om een functie twee keer op dezelfde manier te declareren, dan doe je iets 100% fout. ;)

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 17:18
Is het in php toegestaan om een functie in een functie te maken?
De aanroep is geen probleem dat weet ik wel.

Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
Err, error localized. Het gaat hem dus om het feit dat het altijd werkte omdat makePageTree() nooit twee keer werd aangeroepen op dezelfde pagina, en checkChilds dus nooit twee keer gedeclareerd werd. Om debug-redenen heb ik nu dus makePageTree wel twee keer aangeroepen, wat de foutmelding veroorzaakt.

is dit een 'nette' oplossing?

[code=php]
if(function_exists('checkChilds') !== true) {
function checkChilds($pid, $level = 1) {
[...]
}
}
[/code]


Ik ga het helemaal anders aanpakken, gewoon deze situatie vermijden en de functie buiten de andere functie declareren!

@InfoTracer
InfoTracer schreef op woensdag 06 mei 2009 @ 10:34:
Is het in php toegestaan om een functie in een functie te maken?
De aanroep is geen probleem dat weet ik wel.
Jep, is toegestaan ;)

@--MeAngry--
--MeAngry-- schreef op woensdag 06 mei 2009 @ 10:33:
Ah! Maar een declaratie binnen een andere functie is volgens mij ook global hoor. :) Zo'n functie include je 1 keer aan het begin van je programma-uitvoer en daar moet je het bij laten. Ik zou iets efficienter omgaan met de code die je schrijft en hoe je die hergebruikt. Het moet eigenlijk nooit nodig zijn om een functie twee keer op dezelfde manier te declareren, dan doe je iets 100% fout. ;)
Haha, ja, klopt, 100% heeft geen zin, en zelfs 75% dezelfde code moet je efficiënter kunnen doen ;)

[ Voor 55% gewijzigd door Svennetjee op 06-05-2009 10:40 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
InfoTracer schreef op woensdag 06 mei 2009 @ 10:34:
Is het in php toegestaan om een functie in een functie te maken?
De aanroep is geen probleem dat weet ik wel.
Ja, maar de functie wordt alsnog in de globale namespace gedefinieerd en dat is blijkbaar hier het probleem. Zodra de omkoepelende functie meerdere malen uitgevoerd wordt, wordt ook de functiedefinitie meermalen gedaan.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mijn god wat suf zeg. Ik vraag me dan af wat het achterliggende idee van het kunnen definieren van functies in functies is, als dit niet fatsoenlijk werkt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 15:23
Lijkt me een beetje onnodig om een functie binnen een functie te plaatsen? Dan kan je beter classes gaan gebruiken, dan is de functienaam meteen binnen de scope van deze classe, en heb je ook geen problemen met zelfde functienamen.

Of is er een voorbeeld waarvan het nuttig is om een functie binnen een functie te plaatsen? Ik heb al heel wat afgephp't maar ben in php nog nooit een functie binnen een functie tegengekomen.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
.oisyn schreef op woensdag 06 mei 2009 @ 11:46:
Mijn god wat suf zeg. Ik vraag me dan af wat het achterliggende idee van het kunnen definieren van functies in functies is, als dit niet fatsoenlijk werkt.
'achterliggende idee' is een gevaarlijk aanname. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 18:13
ZpAz schreef op woensdag 06 mei 2009 @ 11:47:
Lijkt me een beetje onnodig om een functie binnen een functie te plaatsen? Dan kan je beter classes gaan gebruiken, dan is de functienaam meteen binnen de scope van deze classe, en heb je ook geen problemen met zelfde functienamen.

Of is er een voorbeeld waarvan het nuttig is om een functie binnen een functie te plaatsen? Ik heb al heel wat afgephp't maar ben in php nog nooit een functie binnen een functie tegengekomen.
Als je er van uit gaat dat de scope van die functie reikt tot het einde van de overkoepelende functie kan eht best nuttig zijn, maar zoals dat gaat in PHP heeft het gewoon geen zin. Bovenstaand probleem heb ik momenteel ook veel netter opgelost..

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

ZpAz schreef op woensdag 06 mei 2009 @ 11:47:
Of is er een voorbeeld waarvan het nuttig is om een functie binnen een functie te plaatsen? Ik heb al heel wat afgephp't maar ben in php nog nooit een functie binnen een functie tegengekomen.
Dat is natuurlijk niet zo gek, als het geen verschil uitmaakt of je het binnen of buiten de functie declareert.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Voutloos schreef op woensdag 06 mei 2009 @ 11:49:
[...]
'achterliggende idee' is een gevaarlijk aanname. ;)
True, het zal wel weer een gevalletje "de implementatie werkt nou eenmaal toevallig zo" zijn. "Hey, een functiedefinitie terwijl we code aan het executen zijn. Hopla, toevoegen aan de functie-definitie-lijst".

[ Voor 18% gewijzigd door .oisyn op 06-05-2009 11:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Er is wel íets voor te zeggen, namelijk wanneer je een include zou doen binnen een functie, wat niet erg vreemd is:

PHP:
1
2
3
4
5
6
7
function inc($foo) {
  if ($foo) {
    include("bar.php");
  } else {
    include("baz.php");
  }
}

Wanneer er nu een functiedefinitie in één van die includes staat zal deze toch in de gloale scope worden opgenomen.

Je mag trouwens wel eens wat aan escaping gaan doen op je site.

[ Voor 13% gewijzigd door CodeCaster op 06-05-2009 13:37 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...

Pagina: 1