&__get() 问题再次出现。重大挫折正在发生
好吧,我感到非常沮丧,即因为我认为我已经解决了这个问题,或者之前已经成功地完成了这个任务。
快速初步:
- 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;
}
Alrighty, I'm getting quite frustrated, namely because I thought I had this issue solved, or had accomplished this successfully before.
Quick preliminary:
- 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!
}
}
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];
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?
Clarification: Things I've tried
The aforementioned:
// 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;
}
Other attempts:
// 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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
__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.我意识到这个问题已经过时了,但我只是在寻找答案时通过谷歌偶然发现了它(我后来找到了答案)。
$this->_data[$key]
是一个返回值的操作,因此返回该值将导致错误,因为它不是引用。要使其返回引用,您必须使用引用:&$this->_data[$key]
。I realize this question is stale, but I just stumbled on it via Google while looking for the answer (which I have since found).
$this->_data[$key]
is an operation that returns a value, so returning the value will result in an error because it's not a reference. To make it return a reference instead, you have to use the reference:&$this->_data[$key]
.没有尝试过这个,因为我避免使用
__get
和__set
,但也许这对你有用:完全未经测试,但看起来它可能可以完成这项工作。
Haven't tried this because I avoid
__get
and__set
, but maybe this would work for you:Totally untested, but it looks like it could maybe do the job.