1

同じクラス内の関数から、クラスで宣言された配列にアクセスしようとしています。私はそれを機能させるためにいくつかの異なる方法を試みましたが、私はPHPに比較的慣れていません。これは私のコードの抜粋です

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);
}

また、globalキーワードをそのまま使用してみました

global $dates;

それでも、「未定義の変数」エラーが発生します。ありがとう!

4

2 に答える 2

9

$this->dates['Date1']の代わりに必要です$this->$dates['Date1']$beforeがないことに注意してくださいdates

補足として、次のようCI_Controllerに定義して、適切に拡張していることを確認してください。__construct()

class Site extends CI_Controller {

    // class properties, etc.

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

    // class methods, etc.

}

もう1つの注意点varは、PHP5で非推奨になりました。public、、privateまたは必要に応じて使用することをお勧めします(編集:もちろん、 PHP5を使用しているprotected仮定します)。

于 2012-06-28T18:09:35.460 に答える
3

ここで必要なことを実行するヘルパークラスを自分で作成します。

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;
    }
}

ここで重要なのは、その範囲などの詳細はすべてクラス内にあるということです。したがって、他の場所で気にする必要はありません。

追加のボーナスとして、この__toStringメソッドは、このオブジェクトをビューに簡単に統合するのに役立ちます。これは、オブジェクトだけを作成できるためですecho

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);
    }

    ...

より良い?

于 2012-06-28T18:21:09.663 に答える