& __ get () снова, проблемы. Большое разочарование в движении - PullRequest
0 голосов
/ 09 июня 2011

Хорошо, я очень разочарован, а именно потому, что думал, что решил эту проблему или уже успешно ее достиг.

Быстрый предварительный просмотр:

  • PHP 5.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;
}

Ответы [ 3 ]

1 голос
/ 03 мая 2013

Я понимаю, что этот вопрос устарел, но я наткнулся на него через 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].

1 голос
/ 09 июня 2011
 echo $myRequest->params['baz'];

Проверка isset в вашей функции __get найдет "params" из $this->_data и вернет массив. Уведомление, которое вы получаете, извне класса и о ключе "baz" в возвращаемом массиве, который в вашем примере фактически никогда не определялся.

0 голосов
/ 09 июня 2011

Я не пробовал это, потому что я избегаю __get и __set, но, возможно, это подойдет вам:

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

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

Полностью не проверено, но похоже, что оно может выполнить эту работу.

...