[PHP] Functie aanroepen in een andere class

Pagina: 1
Acties:

Onderwerpen


  • BryanD
  • Registratie: September 2010
  • Laatst online: 09-11 14:56
Hallo mede tweakerts,

Ik heb een vraag m.b.t. een stuk code waar ik aan werk.
Ik heb de volgende situatie: Ik heb een templating class die a.d.h.v variabelen in de HTML bepaalde blokken html ophalen (ik noem ze 'sections').

Deze sections hebben allemaal een eigen controller om bepaalde functionaliteit te kunnen produceren.
Deze controllers zijn inprincipe niets meer als functies in de class 'SectionController'.
Dit is een klein voorbeeld

HTML:
1
{{bd:var name="menu" type="main"}}


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Hele template class
// en dit staat binnen in de functie die de html door loopt en de custom template tags gaat vervangen

// Debuggen
if(!class_exists('SectionController')){
    $class  = new SectionController;
}

// Nog meer debuggen
print_r(get_class_methods('SectionController'));

// Daadwerkelijke call
$call       = call_user_func_array(array('SectionController', strtolower(trim($aAttrs['name']))), $aAttrs);
if($call == false){
    // En hier gooit hij dus de fout dat 'SectionController::menu' niet bestaat
    throw new Exception('Function <strong>'.strtolower(trim($aAttrs['name'])).'</strong> does not exist in Section Controller');
}else{
    $sReplace   = $call;
}                                       
// rest van de code


PHP:
1
2
3
4
5
6
7
static public function menu($aParams){
    $sHtml  = '';
    // Blok met code die menu items ophaalt e.d.
    // Note: Er staat GEEN fouten in dit stuk aangezien het gehele blok er uit gecomment is.
    // Alleen de definitie van sHtml en de return er van staan niet gecomment.
    return $sHtml;
}


De bovenstaande code hoort dus de functie 'SectionController::menu' uit te voeren, en dat probeert hij ook.
Echter gaat de exception wel af omdat call_user_func_array een fout tegen komt. De functie zelf gooit echter niet met errors. En de print_r laat duidelijk zien dat de functie 'menu' WEL bestaat in de SectionController class.

Zie ik iets over het hoofd waar de toppers van tweakers mij op kunnen wijzen?

Bij voorbaat dank,

Bryan Dijksterhuis

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 17:06

Koetjeboe

Boe, zegt de koe

Levert die menu functie nu ook echt '' terug? Dat is namelijk hetzelfde als false in php ;) (Of als het bijvoorbeeld '0' teruggeeft gaat het ook fout)

code:
1
if($call === false){


Is dan dus wat je wilt.

[ Voor 15% gewijzigd door Koetjeboe op 25-09-2012 11:52 ]


  • BryanD
  • Registratie: September 2010
  • Laatst online: 09-11 14:56
Had ik inderdaad ook al geprobeerd en nee hij levert geen boolean false op.
Dan voert hij gewoon de else statement uit, maar dan blijft $call (en dus ook $sReplace) leeg.
Verder gaat hij met warnings gooien:

Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'SectionController' does not have a method 'menu'

Echter de print_r laat dus zien dat de method 'menu' wel degelijk bestaat in de class 'SectionController'


Edit: Kleine correctie de error is inmiddels weg, dit komt omdat de functie (tijdelijk) de verkeerde naam had. Maar alsnog is de de $call variable leeg. Dit probleem is dus nog niet verholpen

[ Voor 17% gewijzigd door BryanD op 25-09-2012 12:34 ]


  • Rushleader
  • Registratie: November 2011
  • Laatst online: 19-07 11:06
Je hebt ook gezien dat je declaratie van $sHtml leeg is?
Dit zorgt ervoor dat $call leeg blijft.

  • gvdh
  • Registratie: December 2009
  • Laatst online: 13:42
Verander lijn 13 eens in het volgende:
PHP:
1
$call = call_user_func_array(array($class, strtolower(trim($aAttrs['name']))), $aAttrs);

Je geeft de naam van de klasse mee, in plaats van het object. Ik vermoed dat er daardoor gezocht gaat worden naar een statische methode.

  • Rushleader
  • Registratie: November 2011
  • Laatst online: 19-07 11:06
@gvdh De function menu is statisch :p
code:
1
2
3
4
5
6
7
8
9
<?php 
static public function menu($aParams){ 
    $sHtml    = ''; 
    // Blok met code die menu items ophaalt e.d. 
    // Note: Er staat GEEN fouten in dit stuk aangezien het gehele blok er uit gecomment is. 
    // Alleen de definitie van sHtml en de return er van staan niet gecomment. 
    return $sHtml; 
} 
?>

  • BryanD
  • Registratie: September 2010
  • Laatst online: 09-11 14:56
Jup, de menu functie is inderdaad statisch :)
De klasse definitie was overigens ook voor debugging, normaal roep ik alleen de call_user_func_array aan aangezien de klasse toch wel ge-auto load wordt.
Pagina: 1