好的,我感到非常沮丧,这是因为我以为自己已经解决了这个问题,或者之前已经成功完成了这项工作.
Alrighty, I'm getting quite frustrated, namely because I thought I had this issue solved, or had accomplished this successfully before.
快速入门:
- PHP 5.3.6.
- 错误报告更改为11(实际上是 -1;将来很安全,所有错误/通知)
- PHP 5.3.6.
- Error reporting cranked to 11. (-1 actually; future safe, all errors/notices)
我有一个类,它汇总了请求参数.对于傻笑,这里是精简版:
I have a class, it aggregates request parameters. For giggles here is a stripped down version:
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不存在,我总是会出错.我已经尝试过:
Anyways, the reason for arrg! is, no matter what I try, I always get an error whenever the $key doesn't exist. I've tried:
// doesn't work $null = null; if(isset($this->_data[$key])){ return $this->_data[$key]; } return $null; // doesn't work return $this->_data[$key];有人告诉我三元运算符不能得出一个引用,因此,当然不会起作用,但是我们知道从if条件尝试仍然可以.发生什么情况,例如:
I've been told ternary operators cannot result in a reference, ergo, that of course doesn't work, but we know that from the if condition attempt anyways. What happens, for example:
// 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'];我在这里迷失了方向;也许我幻想了一个实现这一目标的场景.不可能(不发出通知)成功做到这一点吗?
I'm losing my mind here; perhaps I hallucinated a scenario where I achieved this. Is it not possible to (without throwing a notice) successfully do this?
说明:我尝试过的事情
上述内容:
// 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; }推荐答案
echo $myRequest->params['baz'];
__get函数中的isset检查将从$this->_data查找"params"并返回数组.您得到的通知是从类外部获取的,并且有关返回的数组中的键"baz"-在您的示例中从未真正定义过.
The isset check in your __get function will look up "params" from $this->_data and return the array. The notice you get is from outside the class and about a key "baz" in the returned array - which in your example was never actually defined.
更多推荐
&
发布评论