我试图使用神奇的php函数将对象链接在一起。
我有一个名为page的抽象类,我网站中的每个页面都扩展了这个类。 在这个抽象类构造函数中,我尝试获取这样的用户对象:
public function __construct( ){
$user = new user();
$this->user = $user->getIdentity();
$this->getHeader();
$this->switchAction( );
$this->getFooter();
}
现在在我的页面中,我可以使用$ this->用户,它运行良好。如果用户已登录,则返回用户对象。 在我的用户类中,我有一个魔法__get& __isset函数:
public function __get ( $name ){
switch ($name){
case 'oAlbums':
return $this->oAlbums = album::get_ar_obj($arWhere = array('user_id' => $this->id) );
break;
public function __isset ( $name ){
switch($name){
case 'oAlbums':
echo 'magic isset called, trying to call '. $name . '<br />';
return isset($this->$name);
break;
}
}
因此,当在页面中时,我想通过调用$this->user->oAlbums
来检查用户是否有任何相册。
这将返回一个包含所有相册对象的数组,如预期的那样。但是当我做的时候
if(empty( $this->user->oAlbums ))
echo 'still give smepty';
在我的页面中,它仍然回显了字符串..
为什么__isset功能不起作用?
答案 0 :(得分:3)
__isset
应该返回TRUE
或FALSE
。如果变量存在且值,则为TRUE,否则为FALSE。您实际上是返回$this->name
的值。您应该返回is_null($this->name)
。将您的代码更改为:
public function __get ( $name ){
switch ($name){
case 'oAlbums':
return $this->oAlbums = album::get_ar_obj($arWhere = array('user_id' => $this->id) );
break;
}
}
public function __isset ( $name ){
switch($name){
case 'oAlbums':
echo 'magic isset called, trying to call '. $name . '<br />';
return !is_null($this->$name);
break;
default:
return FALSE;
}
}
答案 1 :(得分:1)
$this->oAlbums
尚未在你__get()
面前设定吗?试试:
$something = $this->user->oAlbums;
if(empty($this->user->oAlbums)) ...
......它可能会说出不同的东西。在我看来,您的__isset()
应该返回true
,使empty()
实际上__get()
为值。考虑一下这种差异:
<?php
class foo {
function __get($name){
return $this->$name = range(1,3);
}
function __isset($name){
return isset($this->$name);
}
}
class bar {
protected $whatever = array();
function __get($name){
return $this->$name = range(1,3);
}
function __isset($name){
return isset($this->$name);
}
}
class foz {
function __get($name){
return $this->$name = range(1,3);
}
function __isset($name){
return true;
}
}
$foo = new foo();
var_dump(empty($foo->whatever));//true
$void = $foo->whatever;
var_dump(empty($foo->whatever));//false
$bar = new bar();
var_dump(empty($bar->whatever));//false
$foz = new foz();
var_dump(empty($foz->whatever));//false