1

I'm trying to access an array declared in a class from a function within the same class. I've attempted a couple different ways to try to make it work but I'm relatively new to PHP. This is a snippet of my code

class Site extends CI_Controller {

    var $dates = array(
        "Task" => NULL,
        "Date1" => NULL,
        "Date2" => NULL,
        "TimeDiff" => NULL
    );

function index() 
{   
    if($this->$dates['Date1'] != NULL && $this->$dates['Date2'] != NULL)
    {
        $this->$dates['TimeDiff'] = $this->$dates['Date2']->getTimestamp() - $this->$dates['Date1']->getTimestamp();            
    }

    $this->load->view('usability_test', $this->$dates);
}

I also attempted using the global keyword as such

global $dates;

And I still receive a "Undefined variable" error regardless. Thanks!

1
  • Which part in specific of the error don't you understand? Commented Jun 28, 2012 at 18:11

2 Answers 2

9

You want $this->dates['Date1'] instead of $this->$dates['Date1']. Notice the absence of the $ before dates.

As a side note, be sure you're properly extending CI_Controller by defining the __construct()like this:

class Site extends CI_Controller {

    // class properties, etc.

    function __construct(){
        parent::__construct();
    }

    // class methods, etc.

}

Another thing to note, var is deprecated as of PHP5. You'll want to use either public, private, or protected depending on your needs (Edit: assuming, of course, that you are using PHP5).

Sign up to request clarification or add additional context in comments.

1 Comment

@PeteJodo: No problem, I'm glad it helped! See my edits above for a couple of other tips/recommendations.
3

Create yourself a helper class that does what you need here:

class MyTask
{
    private $task;

    /**
     * @var DateTime
     */
    private $date1, $date2;

    ...

    public function getTimeDiff() {
        $hasDiff = $this->date1 && $this->date2;
        if ($hasDiff) {
            return $this->date2->getTimestamp() - $this->date1->getTimestamp();
        } else {
            return NULL;
        }
    }
    public function __toString() {
        return (string) $this->getTimeDiff();
    }

    /**
     * @return \DateTime
     */
    public function getDate1()
    {
        return $this->date1;
    }

    /**
     * @param \DateTime $date1
     */
    public function setDate1(DateTime $date1)
    {
        $this->date1 = $date1;
    }

    /**
     * @return \DateTime
     */
    public function getDate2()
    {
        return $this->date2;
    }

    /**
     * @param \DateTime $date2
     */
    public function setDate2(DateTime $date2)
    {
        $this->date2 = $date2;
    }
}

Key point here is that all the details with that range and stuff is inside the class. So you don't need to care elsewhere.

As additional bonus, the __toString method helps you to easily integrate this object in your views, because you can just echo objects then.

class Site extends CI_Controller
{
    /**
     * @var MyTask
     */
    private $dates;

    public function __construct() {
        $this->dates = new MyTask();
        parent::__construct();
    }

    function index() 
    {
        $this->load->view('usability_test', $this->$dates);
    }

    ...

Better?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.