Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对对象执行empty()测试的强制结果_Php_Oop - Fatal编程技术网

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;