0

さて、私はかなりイライラしています。つまり、この問題が解決されたと思った、または以前にこれを正常に達成したことがあるからです。

簡単な準備:

  • PHP5.3.6。
  • エラー報告は11になりました(-1実際には、将来的に安全で、すべてのエラー/通知

私はクラスを持っています、それはリクエストパラメータを集約します。笑いのためにここに簡略化されたバージョンがあります:

class My_Request{
    private $_data = array();
    public function __construct(Array $params, Array $session){
        $this->_data['params']  = $params;
        $this->_data['session'] = $session;
    }
    public function &__get($key){
        // arrg!
    }
}

とにかく、その理由arrg!は、何をしようとしても、$keyが存在しないときは常にエラーが発生するからです。私はもう試した:

// doesn't work
$null = null;
if(isset($this->_data[$key])){ return $this->_data[$key]; }
return $null;

// doesn't work
return $this->_data[$key];

if三項演算子は参照を生成できないと言われていますが、もちろんそれは機能しませんが、条件の試みからとにかくそれはわかっています。たとえば、次のようになります。

// params will have foo => bar, and session hello => world
$myRequest = new My_Request(array('foo' => 'bar'), array('hello' => 'world'));

// throws an error - Undefined index: baz
echo $myRequest->params['baz'];

私はここで頭がおかしくなっています。おそらく私はこれを達成したシナリオを幻覚させました。(通知をスローせずに)これを正常に行うことはできませんか?


明確化:私が試したこと

前述の:

// no check, no anything, just try returning : fails
public function &__get($key){
    return $this->_data[$key];
}

// null variable to pass back by reference : fails
public function &__get($key){
    $null = null;
    if(isset($this->_data[$key])){
        return $this->_data[$key];
    }
    return $null;
}

その他の試み:

// can't work - can't return null by reference nor via ternary : fails
public function &__get($key){
    return isset($this->_data[$key])
        ? $this->_data[$key]
        : null;
}
4

3 に答える 3

1
 echo $myRequest->params['baz'];

関数のissetチェックは、配列から__get検索して返します。受け取る通知は、クラスの外部からのものであり、返された配列のキーに関するものです。この例では、実際には定義されていません。"params"$this->_data"baz"

于 2011-06-09T04:19:04.887 に答える
1

この質問は古くなっていることに気づきましたが、答えを探しているときにGoogleで見つけました(それ以来見つけました)。

class My_Request{
    private $_data = array();
    public function __construct(Array $params, Array $session){
        $this->_data['params']  = $params;
        $this->_data['session'] = $session;
    }
    public function &__get($key){
        if (array_key_exists($key, $this->_data)) {
            return &$this->_data[$key]; // Note the reference operator
        } else {
            $value = null; // First assign null to a variable
            return $value; // Then return a reference to the variable
        }
    }
}

$this->_data[$key]は値を返す操作であるため、値を返すと、参照ではないためエラーが発生します。代わりに参照を返すようにするには、参照を使用する必要があります&$this->_data[$key]

于 2013-05-03T17:32:40.490 に答える
0

私はとを避けているのでこれを試して__get__setませんが、おそらくこれはあなたのために働くでしょう:

public function __get($key){
   if(!isset($this->_data[$key]))
       return false;

   return $this->_data[$key];    
}

完全にテストされていませんが、おそらくその仕事をすることができるようです。

于 2011-06-09T04:19:12.823 に答える