[PHP] [] operator not supported for strings?!

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb een (heel) eenvoudig template systeempje gemaakt, maar ondervind iets raars. Zie onderstaande code. Op het moment dat theme('menu', 'knop 2') wordt uitgevoerd, krijg ik de error "[] operator not supported for strings". Komt dus door de code onder default in de switch. MAAR tijdens het debuggen viel me op dat dit wel werkte:
PHP:
1
2
3
$type = 'menu';
$content = 'knop 1';
$theme[$type][] = $content;

Bij dezelfde code als hieronder, maar dan buiten de functie, krijg ik geen foutmelding! Ik zit nu al een uur te staren op onderstaande code, en heb al van alles uitgeprobeerd (uitcommenten, etc.) maar ik blijf maar de foutmelding krijgen. Wie ziet waar de voud zit?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function theme($type, $content, $scope = null) {
  global $theme;

  if (!isset($theme[$type])) {
    $theme[$type] = $content;
  }
  else {
    switch ($type) {
      case 'buttons':
        foreach($content as $button) {
          $theme['buttons'][] = '<li>'. $button;
        }
        break;
      case 'script':
        $script = sprintf('<script type="text/javascript" src="%s"></script>', $path);
        if ($scope && $scope == 'footer') {
          return theme('footer', $script);
        }
        else {
          return theme('head', $script);
        }
        break;
      case 'style':
        $style = sprintf('<style type="text/css" media="all">@import "%s";</style>', $path);
        return theme('head', $style);
        break;
      default:
        $theme[$type][] = $content;
    }
  }
}

theme('menu', 'knop 1');
theme('menu', 'knop 2');

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
$theme is een global. Hoe wordt ie buiten de functie gebruikt? Bestaat hij reeds buiten de functie? Is het toevallig een string? (zie foutmelding) ;)

Als je puur het 1e voorbeeldje echt zo los hebt, dan is 't logisch, aangezien $theme nog niet 'gecast' is (zeg ik dat zo goed?). Maar als je hem in je 'grote' script al wel 'gecast' hebt naar bijvoorbeeld een string, dan gaat 't zo niet werken AFAIK. PHP ziet strings geloof ik niet puur als arrays van chars.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

PHP:
1
2
3
if (!isset($theme[$type])) {
    $theme[$type] = $content;
  }

Hier ken je toch echt een string toe aan $theme[$type]

Intentionally left blank


Acties:
  • 0 Henk 'm!

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

Patriot

Fulltime #whatpulsert

De eerste keer gaat het nog goed, $theme['menu'] bestaat dan namelijk nog niet en die maakt hij aan op regel 5. $theme['menu'] bevat dan een string. Je kunt inderdaad geen [] operator gebruiken op een string, dat kan alleen op een array. Als hij vervolgens de tweede keer theme uitvoert bestaat $theme['menu'] wel en gaat hij naar de switch statement. Hij gaat naar default en probeert daar $theme['menu'][] = $content; te doen. Dat gaat natuurlijk niet werken.

Probeer het eens met een regel 5 die er zo uitziet:

PHP:
1
$theme[$type] = array($content);


EDIT:
Hey stommerds! Niet zo snel zijn :(

[ Voor 4% gewijzigd door Patriot op 14-11-2008 23:33 ]


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
crisp schreef op vrijdag 14 november 2008 @ 23:32:
PHP:
1
2
3
if (!isset($theme[$type])) {
    $theme[$type] = $content;
  }

Hier ken je toch echt een string toe aan $theme[$type]
Dat zou strikt gezien toch niet zo erg zijn, aangezien het óf die string wordt óf die switch doorloopt? B)

Acties:
  • 0 Henk 'm!

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

Patriot

Fulltime #whatpulsert

Osiris schreef op vrijdag 14 november 2008 @ 23:36:
[...]

Dat zou strikt gezien toch niet zo erg zijn, aangezien het óf die string wordt óf die switch doorloopt? B)
Dat is de eerste keer niet erg. De tweede keer wel want dan pakt hij de else, en dus de switch.

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 18:04
Tsja de eerste aanroep is globale $theme[type] nog niet gezet. Dan wordt $theme[type] een string gemaakt in regels 4 t/m 6.

Bij de tweede aanroep is $theme[type] dus een string en komt ie in de switch terecht. Dan gebruik je [] dus wel op een string en dat mag niet...


edit: en te laat :)

[ Voor 4% gewijzigd door Morrar op 14-11-2008 23:38 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Wat stom! Ontzettend bedankt allemaal, ik keek er totaal overheen :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Pagina: 1