Hoe require_once declareren als 'is geladen'?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Carsten eng

carsten eng

23/01/2012 12:12:00
Quote Anchor link
Binnen een framework declareer ik met eval een class die dan dus eigenlijk een class in een file override. Nou zijn er soms andere plugins die die file met require_once willen includen. Dat geeft een conflict want die class is al geladen, alleen ziet PHP dat die file nog niet required_once is, dus die laadt m en dan krijg ik dus 'fatal error class iets is already loaded'.

Dus wat ik eigenlijk wil is aan PHP aangeven dat die file al geladen is.
Ik heb me suf gegoogled, maar voorzover ik weet bestaat er niet iets als:

set_require_once_to_loaded($file);
 
PHP hulp

PHP hulp

24/11/2024 15:21:35
 
Kees Schepers

kees Schepers

23/01/2012 12:35:13
Quote Anchor link
Kun je niet beter include_once gebruiken? In dat geval is het geen probleem als een bestand al eerder ingesloten is in je code. Het wordt dan gewoon genegeerd.

Kun je anders je vraag wat duidelijker formuleren?
 
Kris Peeters

Kris Peeters

23/01/2012 12:41:53
Quote Anchor link
Het zou met de volgorde kunnen te maken hebben.
Indien je eerst met require_once een class in een php file laadt, maar later include (zonder require_once) een andere file de zelfde class, dan krijg je een probleem.

Als je de volgorde omdraait, is er geen probleem.

Een voorbeeld:
index.php , gastenboek.php en mijnclasses.php (in de zelfde folder)

index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
/* Indien je eerst de classes laadt met require_once en daarna include't een file die, krijg je een probleem */
/* Als je volgende lijn uit commentaar haalt, krijg je een error */
// require_once ('mijnclasses.php');


echo "Eerst gastenboek.php includen<br/>";
include ('gastenboek.php');
echo "gastenboek.php heeft al mijnclasses.php ge-include; we gaan die opnieuw require_once'en <br/>";
require_once ('mijnclasses.php');
echo "toch geeft dat geen probleem dat de class al gedeclareerd is geweest";
?>


gastenboek.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
include ('mijnclasses.php');
echo '<h2>Gastenboek</h2> ... ';
?>


mijnclasses.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
  class dummyclass {
    public $dummy;
  }

?>
Gewijzigd op 23/01/2012 12:42:18 door Kris Peeters
 
Carsten eng

carsten eng

23/01/2012 14:11:35
Quote Anchor link
nog wat meer uitleg dan.

Ik declareer een class via eval:
(niet netjes, weet ik, maar enige manier om framework te overriden)

eval('class dingclass{ etc.etc.');

Als er een andere plugin dan de file met dezelfde classname include, gaat het fout omdat die class al geladen is.

Daarom zou ik na de eval (waarmee dus de class geladen is, maar niet de file) aan PHP willen zeggen dat die file al geladen is.
 
TJVB tvb

TJVB tvb

23/01/2012 14:11:46
Quote Anchor link
Wat vooral als vraag bij mij op komt is, wat doe je met eval? Misschien begrijp ik je wel helemaal verkeerd, maar het lijk mij niet logisch om eval te gebruiken voor het includen. Hierdoor ben je denk ik bezig een probleem op te lossen wat niet het probleem is.
 
Kris Peeters

Kris Peeters

23/01/2012 15:25:35
Quote Anchor link
Wat kan helpen, is de functie class_exists.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
  if (class_exists('mijnclass')) {
    eval(...)
  }

?>


-----

Maar dan nog blijft het zelfde probleem van de volgorde.
Op welk moment include't het framework die class?

-----

Eventueel kan je het ook doen bij de class zelf.
(Met c++ had ik dat ook af en toe voor, in .h files - Daar bestaat ook een oplossing die hier wat op trekt)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
  if (!class_exists('dummyclass')) {
    class dummyclass {
      public $dummy;
    }
  }

?>
Gewijzigd op 23/01/2012 16:55:16 door Kris Peeters
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.