Search code examples
phpcodeigniter

Uninitialized first variable in a function


I have a strange problem with PHP and CodeIgniter. Here's the code of my file:

Skip this code and go to the second one I wrote. This remains here in case it might be useful.

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');

  require_once('utils.php');

  class FooterHeader {

    // Esta clase nos permite definir el footer y sus correspondientes menus
    var $utils;
    var $controller;

    var $TOPMENU_NOT_LOGGED_IN_NAMES;
    var $TOPMENU_NOT_LOGGED_IN_LINKS;
    var $TOPMENU_LOGGED_IN_NAMES;
    var $TOPMENU_LOGGED_IN_LINKS;
    var $TOPMENU_DESIGNER_NAMES;
    var $TOPMENU_DESIGNER_LINKS;

    // Side menu
    var $SIDEMENU_NOT_LOGGED_IN_NAMES;
    var $SIDEMENU_NOT_LOGGED_IN_LINKS;
    var $SIDEMENU_LOGGED_IN_NAMES;
    var $SIDEMENU_LOGGED_IN_LINKS;
    var $SIDEMENU_DESIGNER_NAMES;
    var $SIDEMENU_DESIGNER_LINKS;

    // Main menu
    var $MAINMENU_NOT_LOGGED_IN_NAMES;
    var $MAINMENU_NOT_LOGGED_IN_LINKS;
    var $MAINMENU_LOGGED_IN_NAMES;
    var $MAINMENU_LOGGED_IN_LINKS;
    var $MAINMENU_DESIGNER_NAMES;
    var $MAINMENU_DESIGNER_LINKS;

    function FooterHeader($controller) {
      $this->utils = new Utils();
      $this->controller = $controller;
      include_once 'defineMenus.php';
      configVars($this);
    }

    public function setDefaultHeader($situation) {
      $topMenuNames = array();
      $topMenulinks = array();
      $MainMenuNames = array ();
      $MainMenuLinks = array ();
      $SideMenuLinks = array ();
      $SideMenuNames = array ();

      // dependiendo del estado del usuario, mostramos cosas u otras
      if ($situation == NOT_LOGGED_IN) {
        $topMenuNames = $this->TOPMENU_NOT_LOGGED_IN_NAMES;
        $topMenuLinks = array ('users/login', 'users/register');
        $MainMenuNames = $this->MAINMENU_NOT_LOGGED_IN_NAMES;
        $MainMenuLinks = $this->MAINMENU_NOT_LOGGED_IN_LINKS;
        $SideMenuLinks = $this->SIDEMENU_NOT_LOGGED_IN_NAMES;
        $SideMenuNames = $this->SIDEMENU_NOT_LOGGED_IN_LINKS;
      }
      else if ($situation == LOGED_IN) {
        $topMenuNames = $this->TOPMENU_LOGGED_IN_NAMES;
        $topMenuLinks = $this->TOPMENU_LOGGED_IN_LINKS;
        $MainMenuNames = $this->MAINMENU_LOGGED_IN_NAMES;
        $MainMenuLinks = $this->MAINMENU_LOGGED_IN_LINKS;
        $SideMenuLinks = $this->SIDEMENU_LOGGED_IN_NAMES;
        $SideMenuNames = $this->SIDEMENU_LOGGED_IN_LINKS;
      }
      else if ($situation == DESIGNER) {
        $topMenuNames = $this->TOPMENU_DESIGNER_NAMES;
        $topMenuLinks = $this->TOPMENU_DESIGNER_LINKS;
        $MainMenuNames = $this->MAINMENU_DESIGNER_NAMES;
        $MainMenuLinks = $this->MAINMENU_DESIGNER_LINKS;
        $SideMenuLinks = $this->SIDEMENU_DESIGNER_NAMES;
        $SideMenuNames = $this->SIDEMENU_DESIGNER_LINKS;
      }
      var_dump ($topMenuLinks);
      $this->setHeader ($topMenulinks, $topMenuNames, $MainMenuLinks, $MainMenuNames, $SideMenuLinks, $SideMenuNames);
    }

    public function setHeader ($topMenuLinks, $linkNames, $menus, $menusNames, $sideMenuLinks, $sideMenuNames) {
      var_dump ($topMenuLinks);
      $enlaces = $this->generateTopMenu ($linkNames, $topMenuLinks);
      $data['enlaces'] = $enlaces;
      $menus = $this->generateMenus ($menusNames, $menus);
      $data['menus'] = $menus;
      $sideMenus = $this->generateSideMenu ($sideMenuLinks, $sideMenuNames);
      $data['sideMenus'] = $sideMenus;

      $this->controller->load->helper('html');
      $this->controller->load->view('static/header.php', $data);
    }
  [...]
  }

Do not read it all. It's not necessary. Just look at the two var_dump calls. The first var_dump prints out:

array (size=2)
  0 => string 'users/login' (length=11)
  1 => string 'users/register' (length=14)

The second one:

array (size=0)
  empty

I don't know why my variable is uninitialized. The rest of the variables are all OK.

Simplified the code:

<?php
  class FooterHeader {

    function FooterHeader($controller) {
      $this->controller = $controller;
    }

    public function setDefaultHeader($situation) {
      $topMenulinks = array();
      // dependiendo del estado del usuario, mostramos cosas u otras
      $topMenuLinks = array('users/login', 'users/register');
      var_dump($topMenuLinks);
      $this->setHeader($topMenulinks);
    }

    public function setHeader($topMenuLinks) {
      var_dump($topMenuLinks);
    }
  }
?>

But the problem is still occurring.

The code doing the calling is this:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
  require_once('utils/footerHeader.php');
  require_once('utils/defineMenus.php');

  class WelcomePage extends CI_Controller {

    var $fh;

    function WelcomePage() {
      parent::__construct();
      $this->fh = new footerHeader($this);

      $this->load->helper('url');
    }

    public function index()
    {
      // seteamos el header (el defecto)
      $this->fh->setDefaultHeader(NOT_LOGGED_IN);

      $this->load->view('subirDisenyoEjemplo.php');

      //$this->fh->setFooter();
    }
  }

  /* End of file welcomePage.php */
  /* Location: ./application/controllers/welcomePage.php */
?>

Solution

  • Watch out for capitalization:

    var_dump($topMenuLinks);
    $this->setHeader($topMenulinks);
    

    $topMenu L inks vs. $topMenu l inks. I tried it on my server, and it immediately popped up as an uninitialized variable.

    Originally:

    The content of your array depends on the outcome of the if - else if construct. Only in this case

    if ($situation == NOT_LOGGED_IN) {
    

    will the array be assigned its value as in the first var_dump(). Otherwise, you will end up with an empty array because it is initialized as

    $topMenulinks = array();
    

    if you have any situation not covered by LOGED_IN or DESIGNER. Watch out for the missing G in LOGED_IN.