isset() 和 __isset() 之间有什么区别?

php
2022-08-30 09:46:06

我需要了解魔术功能和正常功能。其实php语言构造和php魔术方法的真正区别是什么?当我谷歌搜索它时,他们告诉他们这是一个神奇的功能。php中常见的php函数和魔术函数有什么区别?__isset()isset()isset()__isset()__isset()


答案 1

isset()

它是一种语言构造,用于检查变量或类属性的初始化:

$a = 10;

isset($a);     // true
isset($a, $b); // false

class Test
{
    public $prop = 10;
}

$obj = new Test;
isset($obj->prop); // true

__isset()

它是一个神奇的方法,在检查不存在或无法访问的类属性时调用:isset()empty()

class Test
{
    public function __isset($name) {
        echo "Non-existent property '$name'";
    }
}

$obj = new Test;
isset($obj->prop); // prints "Non-existent property 'prop'" and return false

差异:

           isset()                               __isset()
Language construct                    | Magic method
                                      |
Always return bool                    | Result depends on custom logic*
                                      |
Must be invoked in code               | Called automatically by event
                                      |
Unlimited number of parameters        | Has only one parameter
                                      |
Can be used in any scope              | Must be defined as method**
                                      |
Is a reserved keyword                 | Not a reserved keyword
                                      |
Can't be redefined (Parse error)      | Can be redefined in extended class***

__isset()结果无论如何都会自动转换为 .bool

实际上,您可以定义自定义函数,但它与魔术方法无关。__isset()

请参阅此示例


魔术方法

与常见函数不同,函数只能在类作用域中定义,并在特定事件上自动调用,例如:不可访问的方法调用,类序列化,在无法访问的属性上使用时等。另请参阅此官方文档:重载unset()


答案 2

__isset是神奇的方法。魔术方法是内部调用的方法。

请考虑以下代码

<?php
// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    public function __toString()
    {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>

在这里_toString是神奇的方法,但你不会调用它。当线路回波$class时;被执行。PHP知道,现在我应该$class对象视为字符串,并将任何对象视为字符串调用_toString方法,如果在该类中实现。

所有像这样的魔法方法都以间接的方式调用。

另一个示例如下

<?php
class CallableClass
{
    public function __invoke($x)
    {
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

同样,在上面的代码中,var_dump(is_callable($obj));间接调用__invoke魔术方法。


推荐