为了账号安全,请及时绑定邮箱和手机立即绑定

__set() 和 __get() 不能与 isset() 和empty() 一起使用。怎么解决?

__set() 和 __get() 不能与 isset() 和empty() 一起使用。怎么解决?

PHP
阿晨1998 2023-09-08 17:20:00
具有:class foo {        private $myproperty;        public    function __construct() {        if (            ( !isset( $_SESSION ) ) &&            ( session_status() == PHP_SESSION_NONE )        ) {            session_start();        }        public    function __set( $name, $value ) {        if ( property_exists( "foo", $name ) ) {            $_SESSION[ $name ] = $value;        }    }        public    function __get( $name ) {        if ( property_exists( "foo", $name ) ) {            return $_SESSION[ $name ];        }    }    }正在做:$foo = new $foo();$foo->myproperty = "value";if ( isset ($foo->myproperty ) ) {  echo "myproperty setted";} else {  echo "myproperty not setted"}为什么要返回"myproperty not setted"?如果我替换为同样的isset问题 empty。是一个错误吗?如果没有,我该如何修复它?
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您应该使用 __isset() 方法。这是一个例子:


<?php

class Foo {

    private $myproperty;


    public function __construct() {

        if (

            ( !isset( $_SESSION ) ) &&

            ( session_status() == PHP_SESSION_NONE )

        ) {

            session_start();

        }

    }


    public function __set( $name, $value ) {

        if ( property_exists( "foo", $name ) ) {

            $_SESSION[ $name ] = $value;

        }

    }


    public function __get( $name ) {

        if ( property_exists( "foo", $name ) ) {

            return $_SESSION[ $name ];

        }

    }

    

    public function __isset($propertyName){

        return isset($_SESSION[$propertyName]);

    }

}

        



$foo = new foo();

$foo->myproperty = "value";


if ( isset($foo->myproperty) ) {

  echo "myproperty setted";

} else {

  echo "myproperty not setted";

}

?>

请注意,这种方式empty()也可以工作,因为它在内部使用__isset()。


查看完整回答
反对 回复 2023-09-08
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

isset当您在类级别上已经有了神奇的__GET方法并且您已经在实现相同的功能时,您实际上不需要检查。代码中的第二个拼写错误是类名不是,new $foo();而应该是new foo(). 但是,我建议类名使用标题大小写,例如class Foo.

class Foo {


private $myproperty;



public function __construct() {

    if (

        ( !isset( $_SESSION ) ) &&

        ( session_status() == PHP_SESSION_NONE )

    ) {

        session_start();

    }

}



public function __set( $name, $value ) {

    if ( property_exists( "foo", $name ) ) {

        $_SESSION[ $name ] = $value;

    }

}





  public function __get( $name ) {

        if ( property_exists( "foo", $name ) ) {

            return $_SESSION[ $name ];

        }

    }

   

}


$foo = new Foo();

$foo->myproperty = "value";

if ( $foo->myproperty  ) {

  echo "myproperty setted";

} else {

  echo "myproperty not setted";

}

不过,如果您仍在寻找如何使用isset,您可以将以下方法添加到您的class


public function __isset($name)

{

    return isset($_SESSION[$name]);

}


查看完整回答
反对 回复 2023-09-08
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信