Php 对对象执行empty()测试的强制结果
简单类,例如:Php 对对象执行empty()测试的强制结果,php,oop,Php,Oop,简单类,例如: class Foo { protected $_bar; public function setBar( $value ) { $this->_bar = $value; } } 问题是: $obj = new Foo(); var_dump( empty( $obj ) ); // true $obj->setBar( 'foobar' ); var_dump( empty( $obj ) ); /
class Foo
{
protected $_bar;
public function setBar( $value ) {
$this->_bar = $value;
}
}
问题是:
$obj = new Foo();
var_dump( empty( $obj ) ); // true
$obj->setBar( 'foobar' );
var_dump( empty( $obj ) ); // false
是否可以通过使用empty()
函数测试类来改变类的行为,以便在对象未填充数据时返回true
我知道magic function\uu isset($name)
,但只有在测试特定字段时才会调用它,例如:
empty( $obj->someField );
但当测试整个对象时就不是了。PHP5+应该始终将具有或不具有属性的对象视为非空对象。我刚刚在PHP5.3.2服务器上测试了上述代码,var_dump在两种情况下都返回FALSE(这是正确的)。您使用的是哪个版本的PHP 编辑: PHP的“空”行为无法更改。不过,您可以使用自己的空检查功能。试试这个:
function is_empty($object) {
$object = (array)$object;
foreach ($object as $key => $value) {
if (!empty($value)) return FALSE;
}
return TRUE;
}
$obj = new Foo();
var_dump(is_empty($obj)); // true
$obj->setBar('foobar');
var_dump(is_empty($obj)); // false
不,不能更改空函数的行为
class Foo
{
private $_empty = true;
protected $_bar;
public function setBar( $value ) {
$this->_bar = $value;
$this->_empty = false;
}
public function isEmpty() {
return $this->_empty;
}
}
$obj = new Foo();
var_dump( $obj->isEmpty() ); // true
$obj->setBar( 'foobar' );
var_dump( $obj->isEmpty() ); // false
这有点可能。操作码调用
i\u zend\u为true
:
if (!isset || !i_zend_is_true(*value)) {
ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
} else {
ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
}
对象的定义如下(自主干起):
因此,如果对bool的强制转换导致值
false
(或者如果对象是代理对象且代理值转换为false
),则empty
将返回true。但是,要利用这一点,您必须在PHP扩展中编写自定义对象。我无法重现您的问题。您确定使用的是PHP5吗?是-PHP5。也许我没有解释清楚。。将对象指定给变量时,此变量现在不是空的。。因此empty($obj)
返回false。我希望,如果该对象没有填充数据(setBar()
),仍然可以获得true
,但当它被填充时,就可以得到false
。难道你不能在Foo中实现一个isEmpty()成员函数吗?这样你就可以调用$obj->isEmpty(),是的,我可以这样做,但我很感兴趣的是是否可以只使用empty()
。我知道-我有相同的结果。。但我想改变这种行为——这是我的问题——有可能吗?对不起,我误解了你的问题。请参阅上面我编辑的回复。
case IS_OBJECT:
if(IS_ZEND_STD_OBJECT(*op)) {
TSRMLS_FETCH();
if (Z_OBJ_HT_P(op)->cast_object) {
zval tmp;
if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, IS_BOOL TSRMLS_CC) == SUCCESS) {
result = Z_LVAL(tmp);
break;
}
} else if (Z_OBJ_HT_P(op)->get) {
zval *tmp = Z_OBJ_HT_P(op)->get(op TSRMLS_CC);
if(Z_TYPE_P(tmp) != IS_OBJECT) {
/* for safety - avoid loop */
convert_to_boolean(tmp);
result = Z_LVAL_P(tmp);
zval_ptr_dtor(&tmp);
break;
}
}
}
result = 1;
break;